2017-07-02 88 views
-1

數組var [i]從log.txt中讀取所有驅動器的名稱並將其打印在屏幕上。之後,再次打印數組,直到達到'\ 0',只打印第一個字符。不知道爲什麼?從文件讀取後打印字符數組的問題

FILE *fp; 
char var[512]; 
i = 0; 

if (fp = fopen("log.txt", "r+")) { 
    while (fscanf(fp, "%c", &var[i]) != EOF) { 
     printf("%c", var[i]); -----------> Works Fine 
     i++; 
    } 
} 

fclose(fp); 
printf("\n\n"); 

i = 0; 
while(var[i] != '\0') { 
    printf("%c",var[i]);  ------------------> Problem 
    i++; 
} 

輸出:

■N a m e 
C : 
D : 
E : 
F : 
G : 


 ■N   -------------> Problem 
+0

'var'不包含'\ 0'結束,第二循環會隨機停止,否則程序甚至可能會崩潰。如果您正在閱讀單個字符,請不要使用'fscanf',而是使用'fgetc'。使用'fgets'來讀取整行然後解析它總是更好。 – Pablo

+0

另一件我不喜歡的事情是,你認爲文件'log.txt'包含不超過512字節。假設這樣的事情是危險的,一般來說,你應該把用戶輸入(也意味着文件)視爲不可信。你會避免這種痛苦的錯誤。 – Pablo

+0

@Pablo想象一下log.txt的大小是未知的。在這種情況下,我只能給數組分配一個最大大小。 –

回答

-1

你必須除去I = 0;之前循環,因爲它會初始化爲零,這就是爲什麼只有單個字符打印

+0

不,問題是''0'從來沒有寫在'var'中,刪除(我假設你的意思是)第二個'i = 0'使它更糟,因爲現在你開始閱讀甚至超出了寫在第一名 – Pablo

1

你永遠不會寫'\0',其中while迴路然後查找。 所以寫

... 
var[i] = '\0'; 
fclose(fp); 
... 

,你在閱讀文字在第一循環之後,它應該工作。

或者(或額外地),你可以初始化您的數組這樣的,它是「預填充」與0,如:

char var[512] = { 0 }; // will set all 512 characters to 0. 
+0

感謝您的迴應,但它不起作用。 o/p仍然是一樣的。 –

+0

那麼你的例子在這裏和你的代碼是不一樣的。我複製並粘貼了你的代碼,除了'char var [512] = {0}; '線,它的工作原理應該如此。 'log.txt'實際上是8個字節。也許你的時間長了512,因此你會看到奇怪的問題,當你認爲輸入永遠不會超過你的固定尺寸時,你會得到什麼。 – Pablo