2012-08-09 52 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