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
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.
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:
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
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
constchar*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
intch;
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.
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?
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/
Eine eigene Frage?
Dieser Thread ist über 12 Jahre alt.
Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.