3 svar
625 visningar
rka82 51
Postad: 18 jan 2018 10:38

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

Yngve 40591 – Livehjälpare
Postad: 18 jan 2018 12:16 Redigerad: 18 jan 2018 12:30
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 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

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.

Affe Jkpg 6630
Postad: 18 jan 2018 16:59

Läser man en rad i en enda fscanf()?

fscanf(input, "%d %s %s %d", &numberOfSongs, title, artist, &year); //reads one line?

PeBo 540
Postad: 18 jan 2018 17:28

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.

Svara
Close