3 svar
381 visningar
rka82 65
Postad: 18 jan 2018

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 Online 20045 – Volontär digitala räknestugor
Postad: 18 jan 2018 Redigerad: 18 jan 2018
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 6796
Postad: 18 jan 2018

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

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

PeBo 546
Postad: 18 jan 2018

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 Avbryt
Close