2013-05-02 150 views
0

我试图打开多个文件顺序,使用fopen(),只是打印内容和计算字符。 在main()中,我使用不同的文件名称调用两次函数,但函数仅打印第一个文件两次的内容。当然,这两个文件都存在,只要调用此函数打印正确的内容;测试两个文件。在多次调用该函数时似乎存在问题。函数使用fopen()保持打开相同的文件,即使给定不同的文件名作为参数

有人可以给我一个提示吗?什么可能是错的?

我的功能:

void open_and_read(char file_name[80]){  
    char c; 
    int buf_length = 16384; 
    char buf[buf_length]; 
    char* buf_pointer; 
    int i = 0; 
    FILE *file_pointer; 
    file_pointer = fopen(file_name,"r"); 
    buf_pointer = buf; 
    if(file_pointer==NULL){ 
     printf("Error: File %s not opened!", file_name); 
    } 
    else { 
     while(c!=EOF && i<(buf_length-1)){ 
      c = fgetc(file_pointer); 
      *buf_pointer = c; 
      buf_pointer++; 
      i++; 
     } 
     buf_pointer--; 
     *buf_pointer = 0; 
     printf("The file %s contains the follwing: \n%s", file_name, buf); 
     printf("char-count: %i\n", i); 
    } 
    if(fclose(file_pointer)!=0){ 
     printf("File was not closed!"); 
    } 
    else { 
     printf("File was successfully closed!"); 
    } 
} 

的main():

int main(){ 
    open_and_read("/home/x201/dev/IB/data/line1.dat"); 
    open_and_read("/home/x201/dev/IB/data/line2.dat"); 
+0

确定的第二个文件是不是空的? – fjardon 2013-05-02 11:20:44

+0

初始化char c,并将chage类型char转换为int。 – BLUEPIXY 2013-05-02 11:23:08

+0

您是否确认'file_name'在第二个fopen之前是预期的?你是否确认过来自'fopen'的返回码在两个调用中都不为零? – wmorrison365 2013-05-02 11:23:36

回答

3
char c; 

这不是初始化的任何地方。尝试char c = '\0'

编辑

这将是非常合适的,如果你要使用

while(((c = fgetc(file_pointer))!= EOF) && i<(buf_length-1)) 

不会有任何需要初始化c。在第一次进入循环之前,您将收到fgetc本身的值 。

+0

哦,伙计,这有帮助!非常感谢你!! :)我想为什么,虽然... – pxlbrnd 2013-05-02 11:28:44

+1

或while((c = fgetc(file_point))!= EOF)) – 2013-05-02 11:28:48

0

如果你的文件是空的,你的 “buf_pointer--;”将指向SOMETHING;

0

使用char c ='\ 0';

由于char c未初始化,因此auto变量会包含垃圾。

0

这里的问题是char变量“c”。 这将是EOF第二次调用函数open_and_read时,它不会进入while循环,并且不会读取并显示前一个文件包含的第二个文件的包含。

解决方案是: -

焦炭C = '\ 0'

+0

哦,这很有道理!谢谢你的解释! – pxlbrnd 2013-05-02 12:27:43

相关问题