2012-08-09 77 views
-5
// Write a file using fputs() 

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

#undef EOF 
#define EOF "#" 

int main(int argc, char *argv[]) 
{ 
     if(argv[1] == NULL) 
      exit(EXIT_FAILURE); 

     FILE *file = fopen(argv[1], "w") 
     char *str; 

     while(strcmp(str, EOF)) 
      fputs(str, file); 

     fclose(file); 
     exit(EXIT_SUCCESS); 
} 

當我運行它時,在指定我的argv [1]的文件內容的開始處總是有一個空格。爲什麼這樣?C - 文件處理和EOF

還怎麼輸入EOF?每次按

control + D, 

它將其作爲另一個輸入。 我將「#」定義爲EOF,但它在文件內容的末尾。另外,如果我按

control + Z 

,然後嘗試使用TextMate中打開它,它說,文件大小是巨大的(一旦它表明2825 MB!)

+1

該代碼已損壞(您正在使用未初始化的字符串指針)。什麼是您使用的真實代碼? – trojanfoe 2012-08-09 06:57:34

+0

你試過'feof(file)'嗎? – Geoffrey 2012-08-09 06:57:53

+0

@trojanfoe:str未初始化。真正的代碼檢查argv [1]是否爲NULL。休息和這裏給出的一樣。 – 2012-08-09 07:00:07

回答

3

你正在寫的內容由未初始化的指針指向。

char *str; 

    while(strcmp(str, EOF)) 
     fputs(str, file); 

未初始化指針的內容可能指向空白。由於訪問它是未定義的行爲,因此您觀察到的行爲在可能結果的範圍內。

目前尚不清楚你真正想做的事情。

如果您正試圖養活輸入到你的程序,你的程序還沒有被寫入讀取任何輸入,所以EOF就不會被你的程序反正檢測。

如果你想讀取輸入,那麼你需要使用這樣做的功能。一種可能性是fgets

char str[256]; 

while (fgets(str, sizeof(str), stdin) != 0) 
    fputs(str, file); 

你的一個標籤是osx,因此「控制d」是要在命令行中使用什麼。

+1

這不是一個答案。 – trojanfoe 2012-08-09 06:58:05

+0

@trojanfoe:好點? – jxh 2012-08-09 07:00:23

+1

不是。在這個階段沒有回答這個問題。 OP甚至沒有公佈他正在使用的實際代碼。 – trojanfoe 2012-08-09 07:02:05