Avatar billede trp79 Nybegynder
24. september 2002 - 21:18 Der er 7 kommentarer og
1 løsning

Læsning og Skrivning til fil

Hej,
Jeg vil gerne læse fra og skrive til samme fil. Således at jeg kan ændre en værdi (int) i filen(ikke binær) og gemme den med den nye værdi.
Jeg kan læse fra filen med følgende(har det fra en bog):

#include <stdio.h>
#include <stdlib.h>
main()
{
    int c;
    FILE *biobil;

    biobil=fopen("biobil.txt","r+");

    while((c=fgetc(biobil))!=EOF)
    {
        printf("%c\n",c);
    }     
  exit(0);
}

Men overstående læser jo kun hver karakter og skriver det så ud. Jeg forstår ikke hvor der erklæres en int c, når man udskriver c som en char. Det giver da ingen mening, eller?
Kan man ikke læse filen indhold som en streng og så typecast den til en int? i så fald hvordan?
Eller hvordan er det smartes at læse fra en fil når den kun indeholder et tal som der skal laves om på?
Avatar billede mbulow Nybegynder
24. september 2002 - 22:16 #1
En løsning på det du ønsker:
----------------------------

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    FILE    *pFile;
    int      iResult;
    int      iTallet;
   
    pFile = fopen("C:\\Temporary\\biobil.txt", "r+");
   
    if(pFile == NULL){
        printf("Failed to open the file. Please make sure it exists.\n");
        return 0;
    }
   
    iResult = fscanf(pFile, "%d", &iTallet);
   
    if(iResult != 1){
        printf("Failed to read the number. IS this really a number.\n");
        fclose(pFile);
        return 0;
    }
   
    iTallet++;
   
    rewind(pFile);
   
    iResult = fprintf(pFile, "%d", iTallet);
   
    if(iResult < 0){
        printf("Failed to write the new number. Thats kinna wierd.\n");
        fclose(pFile);
        return 0;
    }
   
    return 0;
}
Avatar billede mbulow Nybegynder
24. september 2002 - 22:17 #2
Identisk løsning uden alt kontrol-koden:
(Lidt nemmere overblik over funktionerne :))
--------------------------------------------

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    FILE    *pFile;
    int      iTallet;
   
    pFile = fopen("C:\\Temporary\\biobil.txt", "r+");
       
    fscanf(pFile, "%d", &iTallet);
   
    iTallet++;
   
    rewind(pFile);
   
    fprintf(pFile, "%d", iTallet);
   
    return 0;
}
Avatar billede mbulow Nybegynder
24. september 2002 - 22:21 #3
Angående dit spørgsmål hvorfor fgetc bruger en int når den kun indlæser en char, så er jeg ikke helt sikker, men jeg kunne forestille mig at det har noget at gøre med at den indlæser en værdi som kan kan have 256 (0-255) forskellige værdier. Hvis der skal være plads til at returnere en fejlkode, har du brug for en større datatype, hvor de så har valgt en int (32bit).
Avatar billede mbulow Nybegynder
24. september 2002 - 22:23 #4
Det jeg helt præcist gør, er at jeg:

1) Åbner filen med læse/skrive rettigheder
2) Indlæser tallet med fscanf
3) Ændre lidt på tallet
4) "Spoler" filen tilbage :D
5) Udskriver tallet til samme fil med fprintf

fscanf og fprintf virker vist ligesom scanf og printf, med den ene forskel at de lige skal ha' en filpointer
Avatar billede trp79 Nybegynder
25. september 2002 - 08:43 #5
Det funker jo skønt! Men hvordan læser jeg så fx den næste linie i filen?
Avatar billede trp79 Nybegynder
25. september 2002 - 08:51 #6
if(iResult != 1)betyder det at 1 er "true" og 0 "false"? eller?
Avatar billede mbulow Nybegynder
25. september 2002 - 14:46 #7
Næste linje:
------------
Hvis du bare har to tal stående i din fil, på hver sin linje kan du læse på den her måde:
  fscanf(pFile, "%d", &iTallet);
  fscanf(pFile, "%d", &iTallet2);

Og udskrive dem sådan her:
  fprintf(pFile, "%d\n", iTallet);
  fprintf(pFile, "%d", iTallet2);

Bemærk lige det \n jeg indsatte i den første fprintf, for at være sikker på linjeskiftet :)



iResult != 1:
-------------
Næ nej... Det er ikke et spørgsmål om true/false.
Hvis fscanf gør hvad den skal, helt efter planen skal den returnerer antallet at variable der har fået tildelt en værdi. Det er derfor jeg undersøger om iResult er noget andet end 1, for så må der være et eller andet galt.

Bemærk:
fscanf(pFile, "%d %d", &a, &b)
Skulle efter planen returnere 2, fordi den burde ha tildelt en værdi til begge variable. Den KAN dog returnere 0 eller 1, hvis dataene i filen ikke passer i forhold til datatyperne (mener jeg det er), således at alle variable ikke kan tildeles noget fornuftigt.
(OK blev vist lidt rodet, men find en rigtig beskrivelse af funktionerne, så er du ihvert fald sikker)
Avatar billede soepro Nybegynder
25. september 2002 - 15:27 #8
Se også http://www.eksperten.dk/spm/253687, som beskrives hvordan du kan læse en tabel af tal, ændre i dem, og derpå skrive dem tilbage til filen igen.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester