Datei lesen mit fscanf() in C

Lesezeit: 2 Minuten

Ich muss Daten aus einer Datei lesen und drucken.
Ich habe das Programm wie folgt geschrieben,

#include<stdio.h>
#include<conio.h>
int main(void)
{
char item[9], status;

FILE *fp;

if( (fp = fopen("D:\\Sample\\database.txt", "r+")) == NULL)
{
    printf("No such file\n");
    exit(1);
}  

 if (fp == NULL)
{
    printf("Error Reading File\n");
}

while(fscanf(fp,"%s %c",item,&status) == 1)  
{  
       printf("\n%s \t %c", item,status);  
}  
if(feof(fp))  
{            
         puts("EOF");     
}  
else  
{  
 puts("CAN NOT READ");  
}  
getch();  
return 0;  
}  

die Datei database.txt enthält
Test1 A
Test2 B
Test3 C

Wenn ich den Code ausführe, wird er gedruckt

KANN NICHT LESEN.

Bitte helfen Sie mir, das Problem zu finden.

  • fopen kann aus vielen Gründen scheitern. Drucken "No such file" ist nicht hilfreich, wenn ein Berechtigungsfehler vorliegt. man perror

    – William Pursel

    8. Juni um 13:44 Uhr


Zunächst testest du fp zweimal. Also printf("Error Reading File\n"); wird nie hingerichtet.

Dann die Ausgabe von fscanf sollte gleich sein 2 da Sie zwei Werte lesen.

Benutzer-Avatar
Michael Foukarakis

scanf() und Freunde geben die Anzahl der erfolgreich abgeglichenen Eingabeelemente zurück. Für Ihren Code wären das zwei oder weniger (bei weniger Übereinstimmungen als angegeben). Kurz gesagt, seien Sie etwas vorsichtiger mit den Handbuchseiten:

#include <stdio.h>
#include <errno.h>
#include <stdbool.h>

int main (void) {
    FILE *fp;

    if ((fp = fopen("D:\\Sample\\database.txt", "r+")) == NULL) {
        puts("No such file\n");
        exit(1);
    }

    char item[9], status;
    while (true) {
        int ret = fscanf(fp, "%s %c", item, &status);
        if (ret == 2)
            printf("\n%s \t %c", item, status);
        else if (errno != 0) {
            perror("scanf:");
            break;
        } else if(ret == EOF) {
            break;
        } else {
            puts("No or partial match.\n");
        }
    }
    puts("\n");
    if (feof(fp)) {
        puts("EOF");
    }
    return 0;
}

  • Danke 🙂 //while(42) Was bedeutet das?

    – Guru

    28. Juli 2010 um 11:11 Uhr

  • Es ist gleichbedeutend mit while(1) oder im Pseudocode while(true).

    – Michael Foukarakis

    28. Juli 2010 um 11:18 Uhr

In deinem Code:

while(fscanf(fp,"%s %c",item,&status) == 1)  

warum 1 und nicht 2? Die scanf-Funktionen geben die Anzahl der gelesenen Objekte zurück.

fscanf behandelt 2 Argumente und gibt daher 2 zurück. Ihre while-Anweisung ist falsch und zeigt daher nie an, was gelesen wurde, und da sie nur 1 Zeile gelesen hat, ist if nicht bei EOF, was zu dem führt, was Sie sehen.

1216890cookie-checkDatei lesen mit fscanf() in C

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy