Freigeben über


Die Funktion Fscanf liest keine aufeinander folgenden Zeilen wie erwartet.

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

Originalproduktversion: Visual C
Ursprüngliche KB-Nummer: 60336

Zusammenfassung

Wenn eine Datei im Textmodus geöffnet ist, kann ein Versuch, Textzeilen mithilfe der Fscanf Funktion zu lesen, fehlschlagen, und nur eine Textzeile wird aus der Datei gelesen. Das Trennzeichen ist auf [^\n]. Die Fscanf Funktion liest bis zu, enthält aber nicht das Trennzeichen. Daher stoppt der Dateidatenstrom am ersten \n In der Datei. Nachfolgende Fscanf Funktionsaufrufe schlagen fehl, da der Dateizeiger am Trennzeichen verbleibt und die Fscanf Funktion den Funktionszeiger nicht über sie weiterleiten kann. Wenn Sie den Dateizeiger über das Trennzeichen verschieben möchten, verwenden Sie eine der folgenden beiden Methoden:

  • Aktualisieren Sie den Code, um den folgenden Fscanf Funktionsaufruf zu verwenden:

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

    Der %*c Formatbezeichner liest ein Zeichen aus dem Eingabedatenstrom, weist ihn 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 es EOF erreicht. Das Codebeispiel liest jedoch nur die erste Zeile aus der Datei. 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 oben beschriebene Methode 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);
}