[英]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.