Forum: Compiler & IDEs Problem mit gets Funktio


von peter (Gast)


Lesenswert?

Hi,

ich habe eine Frage kann man mit Hilfe von gets die ausgelesen Zeile 
direkt in einem string kopieren?
Eigentlich möchte ich am Ende haben strTestName=Peter und 
strTestVormane=Klang
1
std::string strTestName= "";
2
std::string strTestVormane= "";
3
FILE *stream;
4
int main()
5
{
6
char line[1024]= "";  
7
if( (stream = fopen( "file.ini", "r" )) == NULL )
8
    {    
9
    }
10
else
11
 {
12
    while( !feof( stream ) )
13
         {
14
          fgets(line, 50, stream);
15
          printf( "%s\n", line);       
16
         }   
17
                            
18
  fclose( stream );
19
20
}
//Inhalt der File
file.ini
1
Name=Peter
2
Vorname=Klang


Danke

von Karl H. (kbuchegg)


Lesenswert?

2 Probleme

Du versuchst an dieser Stelle die C Welt mit der C++ Welt zu verheiraten 
und das ist hier keine so gute Idee

* anstelle von fgets nimmst du std::getline

* das bedingt, dass du anstelle der alten C-File Funktionalität die C++ 
streams benutzt.

1
  std::ifstream input;
2
  std::string line;
3
4
...
5
  input.open( FileName );
6
7
...
8
9
  std::getline( input, line );
10
11
...
12
13
  input.close();

von Karl H. (kbuchegg)


Lesenswert?

PS
Dieses Konstrukt zur kompletten Abarbeitung eines Files ...
1
    while( !feof( stream ) )
2
         {
3
          fgets(line, 50, stream);
4
          printf( "%s\n", line);       
5
         }

ist in C genauso falsch, wie eine korresondierende C++ Version. 
Dateibearbeitung in C++ (bzw. C) funktiont nicht nach dem Muster, dass 
das Programm in die Zukunft schaut. End Of File lässt sich erst dann 
feststellen, wenn ein Leseversuch gestartet wurde und dieser Leseversuch 
wegen des Erreichens des Dateiendes fehlgeschlagen ist.

D.h. diese Schleife wird nie über foef bzw. die gleichwertige Funktion 
aus dem ifstream Objekt gesteuert. Statt dessen sind die Returnwerte 
ALLER Lesefunktionen so aufgebaut, dass sie direkt als Indikator für 
'Ist gut gegangen bzw. ist nicht gut gegangen' benutzt werden können. 
Die Lesefunktion selbst steuert, ob ein weiterer Durchlauf durch die 
Schleife gemacht werden soll. Wird die Schleife beendet, weil ein 
Leseversuch schief gegangen ist, dann stellt sich NACH der Schleife die 
Frage: Warum ist er schief gegangen? Wurde die Leseoperation 
abgebrochen, weil ein eof vorliegt, dann ist alles in Ordnung - die 
Datei wurde korrekt bis zum Ende gelesen. Aber das muss ja nicht so 
sein. Ein Leseversuch kann aus viellerlei Gründen schief gehen, eof ist 
nur einer davon. Die CD kann einen Schaden haben, die Netzwerkverbindung 
ist abgerochen, das WLAN ist ausgefallen, der Benutzer hat den USB Stick 
abgezogen, etc. etc. All das sind Gründe, warum von einer Datei nicht 
(mehr) gelesen werden kann - aber sie sind eben nicht eof.

Skizze:
1
  open
2
3
  while( Lesefunktion )
4
  {
5
    mach was mit dem Gelesenen
6
  }
7
8
  if( !eof )
9
  {
10
    Ausgabe: Beim Lesen der Datei gab es einen Fehler
11
    Abbruch der ganzen Aktion
12
  }
13
  else
14
  {
15
    // Datei einwandfrei gelesen
16
  }
17
18
  close

von Oliver (Gast)


Lesenswert?

Karl Heinz schrieb:
> * anstelle von fgets nimmst du std::getline

Das alleine zaubert aber noch nicht den Peter in strTestVormane. Die 
Auswertung der gelesenen Zeile muß da schon auch noch programmiert 
werden.

Oliver

von A. H. (ah8)


Lesenswert?

peter schrieb:

> ich habe eine Frage kann man mit Hilfe von gets die ausgelesen Zeile
> direkt in einem string kopieren?

Nein. Zwar gibt es eine Member-Funktion:
1
const char* c_str() const;

die Dir Zugriff auf die interne Darstellung des String als C-Array 
einschließlich abschließendem Null-Zeichen gewährt, aber der Zeiger ist 
const und das aus gutem Grund. Änderungen über diesen Zeiger sind durch 
den Standard explizit verboten. Man kann den Schutz mit brachialer 
Gewalt umgehen, das ist aber ganz sicher keine gute Idee.

Wenn Du unbedingt mit C-Streams arbeiten möchtest, dann eher so etwas:
1
int ch;
2
while ( (ch=fgetc(stream) != EOF && ch != '\n' )
3
  mystring.pusch_back(char(ch));

Technisch ist das ohne Probleme möglich, ob das eine gute Idee ist steht 
auf einem anderen Blatt. Da Du schon C++ Strings verwendest wären die 
C++ Streams sicher die bessere Variante.

von peter (Gast)


Lesenswert?

Hallo,
ich programmiere mit Microsoft Visual C++(Vc6)
1
        if( (stream = fopen( "file.ini", "r" )) == NULL )
2
    {
3
           printf("--> Datei %s nicht vorhanden <--\n","file.ini");
4
5
        }
6
        else
7
        {
8
          while( !feof( stream ) )
9
          {
10
              fgets(line, 50, stream);
11
              printf( "%s\n", line);
12
          }
13
          if(feof )
14
          {
15
           printf("--> Lesen beenden  <--\n");
16
          }
17
          else
18
          {
19
          
20
          }
21
         fclose( stream );
22
        }

Ich habe diese kleine Änderung gemacht.
Die ausgelesene Dateien befinden sich in der Variable Line, aber die 
Frage ist wie kann ich es von dort in einer Variable speichern und 
danach bearbeiten?

von Karl H. (kbuchegg)


Lesenswert?

peter schrieb:

> Ich habe diese kleine Änderung gemacht.

Aber du hast nicht verstanden worauf ich hinaus wollte. Das hier
1
         while( !feof( stream ) )
2
...

ist immer noch Unsinn.

Es muss so lauten
1
         while( fgets(line, 50, stream) )
2
           printf( "%s\n", line);

Welchen Teile von 'die Lesefunktion steuert mit ihrem Rückgabewert die 
Schleife' hast du nicht verstanden?

> Die ausgelesene Dateien befinden sich in der Variable Line

sagen wir mal so:
eine Zeile davon. Und im nächsten Schleifensurchlauf dann die nächste 
Zeile

> aber die
> Frage ist wie kann ich es von dort in einer Variable speichern und
> danach bearbeiten?

Spätestens jetzt wird es aber Zeit für ein C++ Buch.
Ein std::string Objekt weiß schon, wie es mit einer Zuweisung von einem 
char-Array umgehen muss. Also einfach
1
      strTestName = line;
aber die viel spannendere Frage lautet: wie kriegst du aus dem String 
nur den Teil raus, den du haben willst?
Nun, dazu gibt es Suchfunktionen und Manipulationsfunktionen, die in 
einem String nach einem bestimmten Zeichen suchen können (zb einem '='), 
die einen Teilstring ab einer bestimmten Position liefern (zb ab der 
Position, die von der Suchfunktion für das Zeichen '=' ermittelt wurde), 
etc. etc.
Ein C++ Buch (für die Methoden, die ein std::string Objekt beherrscht) 
bzw. ein C Buch für derartige Hilfsfunktionen die mit C-Strings (in 
Arrays) umgehen können, ist unumgänglich. Ohne Literatur kommst du in 
der Programmierung nicht weit. Die standardmässig mitgelieferten 
Objekte, die du bei C++ automatisch mitkriegst können eine Menge Dinge 
tun. Du musst nur wissen welche bzw. brauchst eine Beschreibung wie es 
funktioniert. Derartige Beschreibungen gibt es online - trotzdem ist 
Literatur nie verkehrt. Denn so wie es aussieht, ist dir mit einer 
reinen Kurzbeschreibung der Methoden bzw. der Funktion nicht geholfen, 
weil dir noch die Phantasie bzw. die Übung fehlt, wie man aus mehreren 
Einzelfunktionalitäten komplexere Funktionalitäten zusammensetzt. Und an 
dieser Stelle kommt dann die Literatur ins Spiel.


http://www.cplusplus.com/reference/string/string/

von Rolf Magnus (Gast)


Lesenswert?

Übrigens ist das hier:

peter schrieb:
> if(feof )

auch ziemlicher Unsinn, auch wenn der Compiler es akzeptieren mag.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.