Citirea de șiruri de caractere, numere întregi etc. din fișiere utilizând fscanf (Programare, C, String, Număr Întreg, Scanf)

Numitor a intrebat.

Aș dori să mă ajutați să înțeleg cum ar trebui să fac următoarele:

Am un fișier care conține numere întregi separate prin spații ‘ ‘. Trebuie să citesc toate numerele întregi, să le sortez și să le scriu sub formă de șiruri de caractere într-un alt fișier. Am scris un cod, dar am citit șir cu șir, am pus cuvântul într-un sub_arr char [Max_Int] și când am întâlnit ‘ ‘, am pus aceste caractere, acum un șir, după ce l-am atoi-uit într-un alt array Main int,până am ajuns la sfârșitul fișierului, șir cu șir, și apoi le-am sortat și itoa-izat și le-am scris într-un alt fișier.

Dar apoi mi-am amintit că există un fscanf am citit despre ea și tot nu am înțeles complet ce face și cum se folosește.

În cazul meu, în care toate numerele întregi sunt separate prin spațiu, pot să scriu fscanf(myFile,"%s",word)? ar ști să nu ia în considerare ‘ ‘ și să se oprească la sfârșitul șirului specific?! Cum?

Mai mult decât atât, pot să scriu fscanf(myFile,"%d",number) și mi-ar da următorul număr în sine? (Cred că am înțeles greșit, mi se pare magic).

Comentarii

  • este fixat numărul de numere întregi pentru fiecare linie ? –  > Por ziu.
  • Este necesar să folosim C? Instrumente precum Python, Perl, Ruby, Awk, etc. fac foarte bine acest gen de lucru. –  > Por Mark Wilkins.
  • @ziu: Nu, nu este necesar, Mark: Da, învăț C 🙂 –  > Por Numerator.
  • @Numerator: Atunci acesta este un motiv excelent pentru a folosi C 😉 –  > Por Mark Wilkins.
3 răspunsuri
Shahbaz

Aveți dreptate, fscanf vă poate oferi următorul număr întreg. Cu toate acestea, trebuie să îi furnizați un pointer. Prin urmare, aveți nevoie de un & în spatele numărului:

fscanf(myFile, "%d", &number);

*scanf familia de funcții, de asemenea, sări automat peste spațiile albe (cu excepția cazului în care este dat %c, %[ sau %n).

Bucla dvs. cu citirea fișierului va arăta în cele din urmă astfel:

while (you_have_space_in_your_array_or_whatever)
{
    int number;
    if (fscanf(myFile, "%d", &number) != 1)
        break;        // file finished or there was an error
    add_to_your_array(number);
}

Notă laterală: vă puteți gândi la scriere în felul următor:

while (!feof(myFile))
{
    int number;
    fscanf(myFile, "%d", &number);
    add_to_your_array(number);
}

Acest lucru, deși arată bine, are o problemă. Dacă într-adevăr ajungeți la sfârșitul fișierului, veți fi citit un număr de gunoi și veți fi adăugat la datele dvs. înainte de a testa sfârșitul fișierului. Acesta este motivul pentru care ar trebui să folosiți opțiunea while bucla pe care am menționat-o mai întâi.

Comentarii

  • Vă mulțumesc @Shahbaz: Da, am intenționat al doilea cod pe care l-ați scris, deoarece trebuie să fac acest lucru până la sfârșitul fișierului, adică tot fișierul conține numere separate prin spațiu. Cum ar trebui să evit problema pe care ați menționat-o? –  > Por Numerator.
  • @Numerator, folosind primul meu exemplu. –  > Por Shahbaz.
  • Dacă ar fi un fișier binar, iar fiecare 8 biți reprezintă un număr, Pot folosi fscanf și în acest caz, într-un fel sau altul? –  > Por Numerator.
  • @Numerator, nu în mod convențional. Cu fișiere binare, fread este prietenul tău. –  > Por Shahbaz.
  • @chux, aveți dreptate. Am îmbunătățit aceste lucruri după aceea (încercând să scriu răspunsuri mai bune aici), dar nu mi-am amintit acest răspuns pentru a reveni și a-l repara. –  > Por Shahbaz.
jsist

următoarele linii vă vor face treaba, următoarele linii vor citi un singur întreg.

int number;
fscanf(myFile, " %d", &number);

Puneți-l într-o buclă până la sfârșitul fișierului și puneți numărul în matrice.

Josh Greifer

Încercați acest lucru:

#include <stdio.h>


int main(int argc, char* argv[])
{
    char name[256];
    int age;
    /* create a text file */
    FILE *f = fopen("test.txt", "w");
    fprintf(f, "Josh 25 years old
");
    fclose(f);

    /* now open it and read it */
    f = fopen("test.txt", "r");

    if (fscanf(f, "%s %d", name, &age) !=2)
        ; /* Couln't read name and age */
    printf("Name: %s, Age %d
", name, age);

}

Comentarii

  • Acest lucru are o problemă, dacă, din anumite motive, numele din șirul de caractere care este transmis către fscanf este mai mare decât dimensiunea „char nume[256]”, se produce o depășire a bufferului. –  > Por Pedro Sousa.
  • Ei bine, codul așa cum este nu are o problemă, pentru că specifică conținutul bufferului, iar în cod, strlen(name) este < 256. În general, desigur, aveți dreptate -. fscanf_s ar trebui să fie folosit în schimb. Dar întrebarea se referea la utilizarea fscanf. –  > Por Josh Greifer.