Die Fscanf-Funktion liest aufeinander folgende Zeilen nicht wie erwartet.

In diesem Artikel wird ein Problem beschrieben, das auftritt, wenn Sie Textzeilen mithilfe der Fscanf Funktion lesen.

Originalversion des Produkts:   Visual C
Ursprüngliche KB-Nummer:   60336

Zusammenfassung

Wenn eine Datei im Textmodus geöffnet ist, kann der Versuch, Textzeilen mithilfe der Fscanf Funktion zu lesen, fehlschlagen, und es wird nur eine Textzeile aus der Datei gelesen. Das Trennzeichen ist auf [^\n]. Die Fscanf Funktion liest bis zum Trennzeichen, enthält jedoch nicht das Trennzeichen. Daher wird der Dateidatenstrom beim ersten \n in der Datei angehalten. Nachfolgende Funktionsaufrufe Fscanf schlagen fehl, da der Dateizeiger am Trennzeichen verbleibt und die Funktion den Fscanf Funktionszeiger nicht hinter sich lassen kann. Verwenden Sie eine der folgenden beiden Methoden, um den Dateizeiger über das Trennzeichen hinaus zu verschieben:

  • Aktualisieren Sie den Code so, dass der folgende Funktionsaufruf verwendet wird Fscanf :

    fscanf(stream, "%[^\n]%*c", line)
    

    Der %*c Formatbezeichner liest ein Zeichen aus dem Eingabedatenstrom, weist es jedoch keinem der Parameter im fscanf Funktionsaufruf zu.

  • Rufen Sie die Fgetc Funktion nach dem Fscanf Funktionsaufruf auf, um den Dateizeiger über das \n Zeichen hinaus zu verschieben.

Im folgenden Codebeispiel wird dieses Problem veranschaulicht. Das Codebeispiel sollte Zeilen aus einer Textdatei lesen und drucken, bis EOF erreicht ist. Im Codebeispiel wird jedoch nur die erste Zeile aus der Datei gelesen. Da das Ende des Dateizeichens nicht gefunden wurde, wird das Codebeispiel in einer Endlosschleife ausgeführt, wenn der Dateidatenstrom ein \n Zeichen enthält.

Codebeispiel

FILE *stream;
char line[80];

while ((fscanf(stream, "%[^\n]", line))!= EOF )
{
    printf("Line = %s \n",line);
}

Im folgenden Codebeispiel wird die zweite Methode oben veranschaulicht, um dieses Problem zu umgehen:

FILE *stream;
char line[80];

while ((fscanf(stream, "%[^\n]", line))!= EOF)
{
    fgetc(stream); // Reads in '\n' character and moves file
    // stream past delimiting character
    printf("Line = %s \n", line);
}