[英]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,但是您繼續打印以前word
和inputSize
。 然后,由於fgetc()
返回EOF而不是\\n
,您進入了無限循環,因此您要反復嘗試,然后…
修正:
fgetc()
返回一個int
,而不是一個char
。 在純char
是帶符號類型的系統上,這意味着您將EOF誤認為是一個有效字符(通常為ÿ,U + 00FF,帶DIAERESIS的拉丁小寫字母Y)。 在純char
是無符號類型的系統上,沒有匹配的EOF。 兩種行為都不正確。 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.