PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : datei zeilenweise auslesen



avuton
10-01-2003, 09:24
Hallo gibt es eine Funktion, mit der man eine Datei zeilenweise auslesen kann, da es für mein Programm unpraktisch ist einzelne Zeichen einzulesen.
Danke

tkortkamp
10-01-2003, 10:18
Das funktioniert mit fgets.
http://www.pronix.de/C/standard_C/ckurs/ckurs90.html

c ya,
Tobias

avuton
10-01-2003, 10:58
ja funktioniert, aber da hört er nach der ersten Zeile auf, ich habe es so versucht:

FILE *datei;
char c[255];
char zeile2[255];
if((datei=fopen(name, "r"))==NULL)
printf("\nDatei nicht vorhanden...");

while(fgets(c, sizeof(c), datei)){

}
fclose(datei);
printf("%s", c);

kann mir vielleicht jemand sagen, warum?
danke

tkortkamp
10-01-2003, 11:38
Du machst ja gar nichts weiter mit der Zeile...
In der while-Schleife wird doch der Inhalt von c jedesmal wieder mit der nächsten Zeile überschrieben.
Das hier gibt z.B. die gesamte Datei aus.


while(fgets(c, sizeof(c), datei))
{
printf("%s", c);
}


c ya,
Tobias

avuton
10-01-2003, 11:42
gut das klappt, kannst du mir auch sagen, wie ich das Ende jeder Zeile ermitteln kann, damit ich sie dann einzeln bearbeiten kann?
danke

tkortkamp
10-01-2003, 11:46
Mit strlen kannst du die Länge von Strings ermitteln.
=> Länge der Zeile + \n (Newline)

c ya,
Tobias

ContainerDriver
10-01-2003, 11:46
Ich weiß jetzt nicht welche Sprache du verwendest, da ich da aber was von C gesehen hab, verwendest du ja vielleicht auch C++.

Also in C++ geht das so:

//Start
#include <iostream.h>
#include <fstream.h>
//schnipp
ifstream reading(file);

char line[255];


if (reading.good())
{
while (!reading.eof())
{
reading.getline (line,255);
}
}
else
{
cout << "Datei " << file << " nicht gefunden." << endl;
}

//schnapp
//Ende

Die Variable wird immer wieder überschrieben, d. h. wenn du damit irgendetwas machen willst, musst du ein zweidemensionales Feld anlegen oder die Funktion, die mit "line" etwas machen soll, nach reading.getline (..) aufrufen.

Ich hoffe ich konnte dir helfen.
MFG Florian

avuton
10-01-2003, 11:48
nein ich verwende kein c++, deshalb hast du ja auch was von c gelesen und nicht von c++.
trotzdem danke.

avuton
10-01-2003, 11:52
Also die Datei test.txt so:
Nico;Knolde;16
Herbert;Gröhnemeier;50
Captain;Balu;30

und er bearbeitet aber immer nur die letzte Zeile meines Programmes.
Das Programm sieht jetzt so aus(bisschen viel auskommentiert, das sind alte Sachen, falls ich sie noch mal verwende):



#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>
struct namen{
char mvorname[255];
char mnachname[255];
int malter;
int Kundennummer;
char Haustier[255];
};
struct namen angab[2];
int zeige(){
int i=0;
while(i<2){
printf("\n%s %s %d", angab[i].mvorname, angab[i].mnachname, angab[i].malter);
i++;
}
}
int zeile_analyse(char *zeile, char *feld, char trenn){
int i=0;
while(zeile[i]!=trenn){
i++;
if(zeile[i]=='\0')
break;
if(i>255){
i=0;
break;
}
}
if(i==0){
feld=zeile;
zeile="";
}
else{
memcpy(feld, zeile, i);
memcpy(zeile, zeile +i +1, 255 -i);
feld[i]='\0';
}
if(strlen(zeile)==0)
return 0;
else
return 1;
}
int schreibe(char *zeile){

int j;
int i=0;
char feld[255];
char trenn=';';
while(strlen(zeile)!=0){
j=zeile_analyse(zeile, feld, trenn);
i++;
if(j==0)
break;
switch(i){
case 1:
strcpy(angab[0].mvorname, feld);
break;
case 2:
strcpy(angab[0].mnachname, feld);
break;
case 3:
angab[0].malter=atoi(feld);
break;

}

}

//printf("\n%s %s %d", angab[0].mvorname, angab[0].mnachname, angab[0].malter);

return 0;
}

int scanne(char *name){
FILE *datei;
char c[255];
//int i;
//char zeile2[255];
if((datei=fopen(name, "r"))==NULL)
printf("\nDatei nicht vorhanden...");

while(fgets(c, sizeof(c), datei)){
printf("%s", c);
schreibe(c);
//i++;
//c[i] = fgetc(datei);
}
//c[i]='\0';

fclose(datei);
// printf("%s", c);
//schreibe(c);
return 0;
}
int main(void){
//char record[255];
//char zeile[255];
char name[255];
sprintf(name, "test.txt");
scanne(name);
// printf("\n%s %s %d", angab[0].mvorname, angab[0].mnachname, angab[0].malter);
zeige();
//sprintf(zeile, "Nico;Knolde;16");
//schreibe(zeile, record);
return 0;
}


Falss mir jemand sagen kann, woran das liegt, wäre ich sehr dankbar.
danke

EDIT by anda_skoa: code tags

anda_skoa
10-01-2003, 12:03
Original geschrieben von florian hanisch
Ich weiß jetzt nicht welche Sprache du verwendest, da ich da aber was von C gesehen hab, verwendest du ja vielleicht auch C++.

Also in C++ geht das so:

//Start
#include <iostream.h>
#include <fstream.h>
//schnipp
ifstream reading(file);

char line[255];


Naja, fast :)



#include <iostream>
#include <fstream>
#include <string>

using namespace std;


Und line als


string line;


Lesen


getline(reading, line); // ohne Längeneinschränkung, weil Typ string


Ciao,
_

avuton
10-01-2003, 12:09
halllooooooooo, ich will doch gar kein c++, sondern c.
danke

tkortkamp
10-01-2003, 12:26
anda_skoa hat doch bloss florian hanisch verbessert...

Kannst du deinen Code eigentlich mal in [ code] [/ code] Tags packen und einrücken. So wie der jetzt ausschaut blickt man da nur mit viel Mühe durch.

c ya,
Tobias

anda_skoa
10-01-2003, 13:43
Original geschrieben von tkortkamp
anda_skoa hat doch bloss florian hanisch verbessert...


Genau :)



Kannst du deinen Code eigentlich mal in [ code] [/ code] Tags packen und einrücken. So wie der jetzt ausschaut blickt man da nur mit viel Mühe durch.


Ich hab das mal gemacht, aber besser avuton macht es in Zukunft selbst.

Ciao,
_

avuton
15-01-2003, 13:14
Ja kann ich, ich wusste davor nur nicht, wie es geht.
gruß avuton:-)