簡體   English   中英

使用fscanf和fgetc讀取文本行

[英]Reading text lines with fscanf and fgetc

遇到這樣的小問題。 我正在嘗試從文件中讀取文本。 該文件的格式為:

Jim 3 X Y Z 
James 2 A B
Alley 5 D E F G H 

整數表示后面的變量數。 我正在使用fscanf讀取名稱和數字,然后使用fgetc讀取char變量,以便可以將它們放入數組中。 fscanf部分工作正常,但fgetc缺少某些內容。

 do {
    c = fscanf(inputFile, "%s" "%d", word, &inputSize); 
    printf("%s ", word);

    while (c!= '\n')  {
        c = fgetc(inputFile);
        printf("char is:%c ", c);
    }
}while (c != EOF);

最終陷入無限循環。 所以我試着告訴fgetc何時停止。

while (c != EOF){
    c = fscanf(inputFile, "%s" "%d", word, &inputSize); 
    printf("%s ", word);
    printf("%d ", inputSize);
    printf("\n");
    for (i =0;i<(inputSize*2);i++) {
            c = fgetc(inputFile) ;
            if (c== ' ') {
            }
            else {
                 printf("char is :%c ", c);
                 printf("\n");
            }
    }

輸出變為:

 Jim 3 
 char is :X 
 char is :Y 
 char is :Z 
 James 2 
 char is :A 
 char is :B 
 Alley 5 
 char is :D 
 char is :E 
 char is :F 
 char is :G 
 char is :H 
 Alley 5 
 char is :? 
 char is :? 
 char is :? 
 char is :? 
 char is :? 
 char is :? 
 char is :? 
 char is :? 
 char is :? 
 char is :? 

我搞砸了fgetc的哪一部分? 另外,為什么在我的第一個示例中fgetc為什么看不到'\\ n'而是無限循環?

謝謝

在原始代碼中,您具有:

char c;   // Per comments
do {
    c = fscanf(inputFile, "%s" "%d", word, &inputSize); 
    printf("%s ", word);

    while (c!= '\n')  {
        c = fgetc(inputFile);
        printf("char is:%c ", c);
    }
} while (c != EOF);

直到您閱讀了Alley的數據后的換行符之后,此代碼才能正常工作。 然后返回循環的頂部,並使用fscanf()讀取一些數據。 由於沒有數據, fscanf()返回EOF,但是您繼續打印以前wordinputSize 然后,由於fgetc()返回EOF而不是\\n ,您進入了無限循環,因此您要反復嘗試,然后…

修正:

  1. fgetc()返回一個int ,而不是一個char 在純char是帶符號類型的系統上,這意味着您將EOF誤認為是一個有效字符(通常為ÿ,U + 00FF,帶DIAERESIS的拉丁小寫字母Y)。 在純char是無符號類型的系統上,沒有匹配的EOF。 兩種行為都不正確。
  2. 測試EOF或換行符; 總是想一想。
  3. 測試fscanf()的返回值; 如果不是2,則說明出現了問題。

而且我將使用top-checking while循環,而不是使用bottom-checking do … while循環。 在某些情況下會do … while循環; 我認為這不是其中之一。

對修訂后的代碼的分析與此類似。 您的代碼是:

char c = 0;
while (c != EOF){
    c = fscanf(inputFile, "%s" "%d", word, &inputSize); 
    printf("%s ", word);
    printf("%d ", inputSize);
    printf("\n");
    for (i =0;i<(inputSize*2);i++) {
            c = fgetc(inputFile) ;
            if (c== ' ') {
            }
            else {
                 printf("char is :%c ", c);
                 printf("\n");
            }
    }
}

同樣,您需要檢查fscanf()返回的值,如果不是2,請退出循環。前三個printf()調用可以合並為一個。 第一次讀取Alley的數據后, fscanf()返回EOF,但是您可以忽略它並再次打印數據。 然后進入fgetc()循環,該循環將EOF映射到ÿ(0xFF),但這不是空白,因此您將其打印出來(就其本身而言,0xFF在UTF-8中不是有效字節,這也許可以解釋這個問題)標記)。 完成10次迭代后, c包含擴展為EOF的代碼,因此循環終止。

修正:

  • 大致與以前相同。
  • 使用int char;
  • 在繼續之前,請檢查fscanf()的返回值。
  • fgetc()循環中檢查所需的字符或EOF。

原始代碼的可能修復:

int c;
while (fscanf(inputFile, "%s%d", word, &inputSize) == 2)
{
    printf("%s (%d)\n", word, inputSize);

    while ((c = getc(inputFile)) != EOF && c != '\n')
    {
        if (c != ' ')
            printf("char is: %c\n", c);
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM