簡體   English   中英

使用fscanf在C中讀取

[英]Reading in C using fscanf

我做了研究,做了幾次嘗試,但都沒有成功,我也不知道為什么,因為我和初學者幾乎一樣。

從文本文件:

您好; 20

等待10

請; 5

我想將第一個單詞“ Hello”保存到變量中,將數字20保存到另一個變量中。 其余各行也是如此。

我有這個:

int main()
{

FILE* file;
char fileName[50];
int seconds;

file = fopen("order.txt","r");

while(fscanf(file,"%s;%d",&fileName,&seconds) != EOF)
{

printf("%s",fileName);
printf("\n");
sleep(seconds);

}

fclose(file);
}

我試圖更改fscanf中的內容,但沒有任何效果,輸出如下:

您好; 20

等待10

請; 5

----------------------

我嘗試了一些新的東西(好像我應該編輯它而不是創建答案),它是從這樣的文件中獲取內容的:

將Order.txt

hello.txt的; 20

wait.txt; 10

please.txt; 5

我想要一個文件名,將其打開,顯示X時間的內容,全部顯示為3,這導致我:

orderFile = fopen("order.txt","r");

        while(fscanf(orderFile,"%49[^;];%d",fileName,&seconds) == 2)
        {
            contentFile = fopen(fileName,"r");

            while(fscanf(contentFile,"%[^\t]",textContent) == 1)
            {
                printf("%s\n", textContent);
            }

            sleep(seconds);

            fclose(contentFile);
        }

        fclose(orderFile);

但是,它僅顯示第一個文件內容,等待20秒鍾,然后結束程序。 我希望它顯示整個文件的內容。 我該怎么做?

接受答案后

以下格式"%49[^;];%d"將前一行的'\\n'讀取為文件名的一部分。 最好先使用領先的空白

while(fscanf(file,"%s;%d",&fileName,&seconds) != EOF)       // OP original
while (2 == fscanf(file,"%49[^;];%d", fileName, &seconds))  // problem
while (2 == fscanf(file," %49[^;];%d", fileName, &seconds)) // better-space added

甚至更好:因為數據是每行的 ,所以讀取該 ,然后解析該字符串 由@ jamesdlin建議

#define INT_STRING_SIZE_MAX  22
char buf[(sizeof fileName + INT_STRING_SIZE_MAX) * 2];  // I like 2x buffers

while(fgets(buf, sizeof buf, file) != NULL) {
  if (2 != sscanf(buf,"%49[^;];%d", fileName, &seconds)) {
    break;  // Maybe add format error message.
  }
  ...
}

sscanf(buf,"%49[^;];%d"... ,一個" "不需要為代碼讀取線由行和沒有“上一行的'\\n' ”存在。

通常,具有%s fscanf()停止在空白處讀取字符串,但是在這種情況下,您要在;停止; 因此,您需要使用方括號表達式(掃描集)來排除; 代替%s

另外,我在%之后添加了49,以防止緩沖區溢出,並測試兩個變量是否已更新,並將char *而不是char (*)[50]傳遞給%[^;]轉換規范。

 while (2 == fscanf(file,"%49[^;];%d", fileName, &seconds))

因此,我使用了一些Jasen代碼和bluepixy,它們是:

而不是:

while(fscanf(file,"%s;%d",&fileName,&seconds) != EOF)

我現在有:

while(fscanf(file,"%[^;];%d",&fileName,&seconds) != EOF)

而且有效。 但是,我不知道為什么?

因為它是.txt,它已經將第一個作為字符串讀取了? 為什么我放%[^;]無效? 我不太了解。

fscanf返回成功掃描的項目數(請參見fscanf(3)手冊頁)。 您應該使用:

while(fscanf(file,"%s;%d",&fileName,&seconds) == 2) 

屁股甚至很危險。 最好提供您的fileName的最大寬度,在[A-Za-z0-9_] (或任何適合您的設置)僅接受49個字符(並在結尾的0字節處留一個空格),因此

  while(fscanf(file,"%49[A-Za-z0-9_];%d",&fileName,&seconds) == 2) 

實際上,我會循環使用getline(3) (或其他fgets )讀取每一行,並分別解析(使用某些sscanf ,或者手動解析)。

您需要定義更多什么是可接受的輸入。 分號前可以出現哪些字符? 您確定要接受所有這些嗎? 您正在使用UTF-8嗎? CAn您的輸入文件包含頑皮的字節嗎? (例如非UTF-8編碼或控制字符)? é (法語重音e), (切諾基HV), Ы (西里爾語yeru), א (希伯來字母aeph), Ω (希臘大寫歐米茄)是否算作字母? 分號周圍是否可以接受空格? 也許您想要一些像libunistring這樣的UTF-8庫?

暫無
暫無

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

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