Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: C++ (auch C++0x und C++11) ::  String aus Datei lesen     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
wabbul
Unregistrierter




Beitrag wabbul Unregistrierter 15:47:13 20.10.2009   Titel:   String aus Datei lesen            Zitieren

Guten Tag,

Ich möchte einen String, den ich zuvor mit fprintf in eine datei geschreiben habe wieder auslesen und mit cout ausgeben lassen.

Meine Lösung:
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include
<string>

#define
MAXE 200

using namespace std;

int main()
{
    string satz, ausgabe[MAXE] ;
    char monat ;
    FILE *datei_ptr ;
   
    cout << "Bitte Satz eingeben: \n" ;
   
     while(satz.empty()) getline (cin, satz);
   
    cout << "\n Der Satz war: " << satz <<"\n\n" ;
   
    cout << "Beginn der Dateidings.\n" ;
   
    datei_ptr = fopen("abc.txt", "w");
   
    if (datei_ptr != NULL)
    {
        fprintf(datei_ptr, "test");
        fgets (ausgabe, MAXE, datei_ptr);
        fclose (datei_ptr) ;
    }
   
    return 0 ;
   
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include
<string>

#define
MAXE 200

using namespace std;

int main()
{
string satz, ausgabe[MAXE] ;
char monat ;
FILE *datei_ptr ;

cout << "Bitte Satz eingeben: \n" ;

while(satz.empty()) getline (cin, satz);

cout << "\n Der Satz war: " << satz <<"\n\n" ;

cout << "Beginn der Dateidings.\n" ;

datei_ptr = fopen("abc.txt", "w");

if (datei_ptr != NULL)
{
fprintf(datei_ptr, "test");
fgets (ausgabe, MAXE, datei_ptr);
fclose (datei_ptr) ;
}

return 0 ;

}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
#include <iostream>
#include
<string>

#define
MAXE 200

using namespace std;

int main()
{
    string satz, ausgabe[MAXE] ;
    char monat ;
    FILE *datei_ptr ;
   
    cout << "Bitte Satz eingeben: \n" ;
   
     while(satz.empty()) getline (cin, satz);
   
    cout << "\n Der Satz war: " << satz <<"\n\n" ;
   
    cout << "Beginn der Dateidings.\n" ;
   
    datei_ptr = fopen("abc.txt", "w");
   
    if (datei_ptr != NULL)
    {
        fprintf(datei_ptr, "test");
        fgets (ausgabe, MAXE, datei_ptr);
        fclose (datei_ptr) ;
    }
   
    return 0 ;
   
}


funktioniert nicht:
Code:
 Fehler: »std::string*« kann nicht nach »char*« für Argument »1« nach »char* fgets(char*, int, FILE*)« umgewandelt werden
Code:
Fehler: »std::string*« kann nicht nach »char*« für Argument »1« nach »char* fgets(char*, int, FILE*)« umgewandelt werden
Code:
 Fehler: »std::string*« kann nicht nach »char*« für Argument »1« nach »char* fgets(char*, int, FILE*)« umgewandelt werden


Was sollte ich statt fgets verwenden?
SeppJ
Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 13576
Beitrag SeppJ Moderator 15:53:49 20.10.2009   Titel:              Zitieren

Vergiss die ganzen C Dateioperationen. Wenn du mit Klassen arbeiten willst (oder auch ganz allgemein), nimm die C++ Dateistreams. Die haben dann schönerweise schon passende Operatoren für gängige Klassen wie std::string überladen. Und falls du nicht weißt, wonach du suchen sollst, gebe ich noch ein paar Stichwörter: fstream, ifstream, ofstream.

Außerdem: Ein Array von strings? Ich glaube nicht, dass du das willst.


Zuletzt bearbeitet von SeppJ am 15:54:31 20.10.2009, insgesamt 1-mal bearbeitet
wabbul
Unregistrierter




Beitrag wabbul Unregistrierter 19:20:18 20.10.2009   Titel:              Zitieren

Hallo,

Vielen Dank für den Hinweis.

Allerdings habe ich nun ein neues Problem:

C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include
<string>
#include
<fstream>

#define
MAXE 200

using namespace std;

int main()
{
    string satz, s ;
    char monat ;
    fstream f ;
   
    cout << "Bitte Satz eingeben: \n" ;
   
     while(satz.empty()) getline (cin, satz);
   
    cout << "\n Der Satz war: " << satz <<"\n\n" ;
   
    cout << "Beginn der Dateidings.\n" ;
   
    f.open("abc.txt", ios::in | ios::out | ios::app) ;
   
   
     while (!f.eof())          // Solange noch Daten vorliegen
    {
   
    getline(f, s);        // Lese eine Zeile
        cout << s << endl;    // Zeige sie auf dem Bildschirm
    f  <<"foo" ;
   
    }

   
   
    f.close() ;
   
   
   
    return 0 ;
   
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include
<string>
#include
<fstream>

#define
MAXE 200

using namespace std;

int main()
{
string satz, s ;
char monat ;
fstream f ;

cout << "Bitte Satz eingeben: \n" ;

while(satz.empty()) getline (cin, satz);

cout << "\n Der Satz war: " << satz <<"\n\n" ;

cout << "Beginn der Dateidings.\n" ;

f.open("abc.txt", ios::in | ios::out | ios::app) ;


while (!f.eof()) // Solange noch Daten vorliegen
{

getline(f, s); // Lese eine Zeile
cout << s << endl; // Zeige sie auf dem Bildschirm
f <<"foo" ;

}



f.close() ;



return 0 ;

}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <iostream>
#include
<string>
#include
<fstream>

#define
MAXE 200

using namespace std;

int main()
{
    string satz, s ;
    char monat ;
    fstream f ;
   
    cout << "Bitte Satz eingeben: \n" ;
   
     while(satz.empty()) getline (cin, satz);
   
    cout << "\n Der Satz war: " << satz <<"\n\n" ;
   
    cout << "Beginn der Dateidings.\n" ;
   
    f.open("abc.txt", ios::in | ios::out | ios::app) ;
   
   
     while (!f.eof())          // Solange noch Daten vorliegen
    {
   
    getline(f, s);        // Lese eine Zeile
        cout << s << endl;    // Zeige sie auf dem Bildschirm
    f  <<"foo" ;
   
    }

   
   
    f.close() ;
   
   
   
    return 0 ;
   
}


Die Anweisung f <<"foo"; wird einfach übersprungen.

Setze ich sie while Schleife, wird die f << "foo" zwar ausgeführt, aber dafür wird alles danach übersprungen.

Wie kann ich in einem Schritt etwas neues in eine Datei schreiben und sie auslesen?
SeppJ
Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 13576
Beitrag SeppJ Moderator 19:42:00 20.10.2009   Titel:              Zitieren

Deine Operationen werden schon durchgeführt, jedoch:
1) while(!f.eof()) ist keine sehr gute Möglichkeit auf ein Dateiende zu prüfen.
2) Du musst beachten, wo der Lesepointer und der Schreibpointer hinzeigen. Diese zeigen an die Position, wo die nächste Lese-/Schreiboperation durchgeführt werden soll.
3) Wenn eine Lese- oder Schreibaktion schiefgeht (z.B. weil du dein getline auf eine leere Datei anwendest) wird daraufhin das failbit gesetzt. Dieses verhindert vorerst weiteres Lesen und Schreiben, bis die Situation geklärt wurde.

Deine Probleme sind auf ein Zusammenwirken dieser drei Punkte zurückzuführen. Ich kann dir später mal ein Beispiel zeigen, wie man das richtig machen kann, jedoch will ich zuerst mal wissen: Was soll das überhaupt werden? Reine Übung?
wabbul
Unregistrierter




Beitrag wabbul Unregistrierter 19:48:41 20.10.2009   Titel:              Zitieren

Richtig. Reine Übung. Ich versuche mich seit 24 Stunden an c++ und möchte in erster Linie erfahren wie ich mit Strings und Dateien umgehen soll.

Über das Beispiel würde ich mich sehr freuen, vielen Dank schonmal.
SeppJ
Moderator

Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 13576
Beitrag SeppJ Moderator 20:32:58 20.10.2009   Titel:              Zitieren

Da hast du dir aber eine Menge vorgenommen, für 24 h C++. In der Praxis hat man es fast nur mit streams zu tun, die rein lesend oder rein schreibend verwendet werden. Beides gleichzeitig verkompliziert die Sache nur. Ich selber habe gerade festgestellt, dass der Schreib- und Lesezeiger offenbar identisch sind, im Gegensatz zu dem, was ich bisher angenommen habe. Ich hab's nur noch nie gemerkt, weil ich es noch nie benutzt habe.

trotzdem ist hier eine kleine Demo der Sachen, die du in deinem Programm ausprobiert hast. Zusätzlich habe ich auch mal binäres Lesen demonstriert, weil fast alle Anfänger nach kurzer Zeit hier im Forum danach fragen:
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include<iostream>
#include
<fstream>
using namespace std;

int main()
{
  fstream file;
  file.open("abc.txt", ios::in | ios::out | ios::trunc);   // Datei öffnen. Trunc sorgt dafür, dass die Datei leer ist, so dass dieses Beispiel immer funktioniert.

  // Der Lese-/Schreibpointer zeigt jetzt auf den Anfang

  // Schreibe ein bisschen was in die Datei

  file << "Hello World!" << endl;
 
  // Der Dateipointer zeigt jetzt hinter den obigen Text. Da die Datei leer war, ist das auch gleichzeitig das Ende
  cout << file.tellp()<<endl; // 13
  // Der Lese und der Schreibpointer sind nicht unabhängig voneinander:

  cout << file.tellg()<<endl; // 13
 

  // Lese nun aus der Datei. Es wird getline verwendet um komfortabel eine ganze Zeile zu lesen. Zuerst muss aber der Dateipointer wieder auf den Anfang gesetzt werden:

  file.seekg(0);
  string foo;
  getline(file,foo);
  // Gebe das Ergebnis aus:
  cout <<  foo << endl;   // Hello World!

  // Schließe die Datei

  file.close();

  // Nun noch eine Demonstration, wie man feststellt, ob noch Daten vorliegen.
  // Öffne nochmals die Datei diesesmal nur zum Lesen und im Binärmodus, mit dem man unformatiert lesen kann (das heißt, ohne Whitespace automatisch zu überspringen)

  file.open("abc.txt", ios::in | ios::binary); // Eigentlich könnte und sollte man zum lesen gleich einen ifstream nehmen

  char bar;
  while(file.get(bar))  // Solange noch Daten vorliegen
    {
      cout << bar;       // gebe diese aus
      // Gibt "Hello World!" aus, inklusive abschließendem newline

    }
}  // file wird automatisch geschlossen, wenn wir den Scope verlassen, wozu auch das Programmende zählt.
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include<iostream>
#include
<fstream>
using namespace std;

int main()
{
fstream file;
file.open("abc.txt", ios::in | ios::out | ios::trunc); // Datei öffnen. Trunc sorgt dafür, dass die Datei leer ist, so dass dieses Beispiel immer funktioniert.

// Der Lese-/Schreibpointer zeigt jetzt auf den Anfang

// Schreibe ein bisschen was in die Datei

file << "Hello World!" << endl;

// Der Dateipointer zeigt jetzt hinter den obigen Text. Da die Datei leer war, ist das auch gleichzeitig das Ende
cout << file.tellp()<<endl; // 13
// Der Lese und der Schreibpointer sind nicht unabhängig voneinander:

cout << file.tellg()<<endl; // 13


// Lese nun aus der Datei. Es wird getline verwendet um komfortabel eine ganze Zeile zu lesen. Zuerst muss aber der Dateipointer wieder auf den Anfang gesetzt werden:

file.seekg(0);
string foo;
getline(file,foo);
// Gebe das Ergebnis aus:
cout << foo << endl; // Hello World!

// Schließe die Datei

file.close();

// Nun noch eine Demonstration, wie man feststellt, ob noch Daten vorliegen.
// Öffne nochmals die Datei diesesmal nur zum Lesen und im Binärmodus, mit dem man unformatiert lesen kann (das heißt, ohne Whitespace automatisch zu überspringen)

file.open("abc.txt", ios::in | ios::binary); // Eigentlich könnte und sollte man zum lesen gleich einen ifstream nehmen

char bar;
while(file.get(bar)) // Solange noch Daten vorliegen
{
cout << bar; // gebe diese aus
// Gibt "Hello World!" aus, inklusive abschließendem newline

}
} // file wird automatisch geschlossen, wenn wir den Scope verlassen, wozu auch das Programmende zählt.
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#include<iostream>
#include
<fstream>
using namespace std;

int main()
{
  fstream file;
  file.open("abc.txt", ios::in | ios::out | ios::trunc);   // Datei öffnen. Trunc sorgt dafür, dass die Datei leer ist, so dass dieses Beispiel immer funktioniert.

  // Der Lese-/Schreibpointer zeigt jetzt auf den Anfang

  // Schreibe ein bisschen was in die Datei

  file << "Hello World!" << endl;
 
  // Der Dateipointer zeigt jetzt hinter den obigen Text. Da die Datei leer war, ist das auch gleichzeitig das Ende
  cout << file.tellp()<<endl; // 13
  // Der Lese und der Schreibpointer sind nicht unabhängig voneinander:

  cout << file.tellg()<<endl; // 13
 

  // Lese nun aus der Datei. Es wird getline verwendet um komfortabel eine ganze Zeile zu lesen. Zuerst muss aber der Dateipointer wieder auf den Anfang gesetzt werden:

  file.seekg(0);
  string foo;
  getline(file,foo);
  // Gebe das Ergebnis aus:
  cout <<  foo << endl;   // Hello World!

  // Schließe die Datei

  file.close();

  // Nun noch eine Demonstration, wie man feststellt, ob noch Daten vorliegen.
  // Öffne nochmals die Datei diesesmal nur zum Lesen und im Binärmodus, mit dem man unformatiert lesen kann (das heißt, ohne Whitespace automatisch zu überspringen)

  file.open("abc.txt", ios::in | ios::binary); // Eigentlich könnte und sollte man zum lesen gleich einen ifstream nehmen

  char bar;
  while(file.get(bar))  // Solange noch Daten vorliegen
    {
      cout << bar;       // gebe diese aus
      // Gibt "Hello World!" aus, inklusive abschließendem newline

    }
}  // file wird automatisch geschlossen, wenn wir den Scope verlassen, wozu auch das Programmende zählt.
wabbul
Unregistrierter




Beitrag wabbul Unregistrierter 21:26:06 20.10.2009   Titel:              Zitieren

Herzlichen Dank, besser hätte man es sich ja nicht wünschen können.

Die 24h sind ja keine Vorgabe, Zeit ist genug vorhanden.
C/C++ Forum :: C++ (auch C++0x und C++11) ::  String aus Datei lesen   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.