Läsa från textfil
Hej!
Jag håller på med en programmeringsuppgift där man ska läsa in en låtlista från en textfil. Har suttit länge med detta och får inte ordning på det så hjälp vore ovärdeligt!
Textfilen jag använder som exempel följer nedan. Den första siffran anger det totala antalet låtar i listan, sedan följer ny rad med låtnamn, ny rad med artist och till sist en rad med årtal på låten. Normalt när man skriver en textfil från ett C program blir det ju: number \n song \n artist\n year men här ska det läsas från nya rader. När man öppnar textfilen ser den ut så här:
1
cyanide
metallica
1977
//jag använder en låt för enkelhets skull i exemplet
Utmaningen ligger i att läsa in detta rätt. Hur läser jag en rad, byter rad och läser nästa osv?
Koden jag har nu följer under. När den används får jag testutskriften:
\n
\n
cyanide
\n
\n
-8474739 (skräp)
Koden är:
int main()
{
FILE *input;
char title[MAX];
char artist[MAX];
int year;
int numberOfSongs;
input = fopen("songs.txt","r");
fscanf(input, "%d", &numberOfSongs); //reads the first number
fgets(title, MAX, input); //reads songtitle
fgets(artist, MAX, input); //reads artist
fscanf(input, "%d", &year); //reads year
fclose(input);
printf("\t%s", title); //prints title to test program and so on
printf("\n\n\t%s", artist);
printf("\n\n\t%d", year);
getchar();
return 0;
}
Uppskattar all tips och hjälp och bara säg till om jag ska förtydliga något! //Roger
rka82 skrev :Hej!
Jag håller på med en programmeringsuppgift där man ska läsa in en låtlista från en textfil. Har suttit länge med detta och får inte ordning på det så hjälp vore ovärdeligt!
Textfilen jag använder som exempel följer nedan. Den första siffran anger det totala antalet låtar i listan, sedan följer ny rad med låtnamn, ny rad med artist och till sist en rad med årtal på låten. Normalt när man skriver en textfil från ett C program blir det ju: number \n song \n artist\n year men här ska det läsas från nya rader. När man öppnar textfilen ser den ut så här:
1
cyanide
metallica
1977
//jag använder en låt för enkelhets skull i exempletUtmaningen ligger i att läsa in detta rätt. Hur läser jag en rad, byter rad och läser nästa osv?
Koden jag har nu följer under. När den används får jag testutskriften:\n
\n
cyanide
\n
\n
-8474739 (skräp)Koden är:
int main()
{
FILE *input;
char title[MAX];
char artist[MAX];
int year;
int numberOfSongs;input = fopen("songs.txt","r");
fscanf(input, "%d", &numberOfSongs); //reads the first number
fgets(title, MAX, input); //reads songtitle
fgets(artist, MAX, input); //reads artist
fscanf(input, "%d", &year); //reads year
fclose(input);printf("\t%s", title); //prints title to test program and so on
printf("\n\n\t%s", artist);
printf("\n\n\t%d", year);getchar();
return 0;}
Uppskattar all tips och hjälp och bara säg till om jag ska förtydliga något! //Roger
Nu var det rätt länge sedan jag kodade i c, men jag känner igen problemet.
Textfilen innehåller radslutstecken (någon kombination av CR och/eller LF) som du på något sätt läser in till dina variabler. Inspektera filen och ta reda på hur den verkligen ser ut.
fgets läser fram till och med CR och ersätter det med ett NULL.
Du måste alltså hantera situationen med CR+LF, LF+CR eller bara LF.
Läser man en rad i en enda fscanf()?
fscanf(input, "%d %s %s %d", &numberOfSongs, title, artist, &year); //reads one line?
En enkel
fseek(input, 1, SEEK_CUR);
efter din första fscanf som läser in antalet låtar tar dig förbi det första radslutet.
Det är nog rätt tänkt att du först läser in hur många låtar man har lagrade, och sen kan läsa in varje block.
Ett tips kan vara att lägga till en utskrift av ftell(input) så ser du hur långt din läsning har avancerat. Det var så jag förstod vad som behövde göras.