2015-10-15 59 views
-2

好的,这里是交易......我记得上周创建一个程序需要我以二进制模式打开文件并将数据写入它。起初,我尝试使用fopen函数,检查结果是否正确,然后尝试写入数据。我记得第一次尝试时,fwrite操作不起作用。然后,在将变量的声明从一个地方移动到另一个地方之后,我终于能够使fwrite将数据插入到文件中。现在,我需要创建另一个类似的程序来做一些其他的事情,所以我想使用相同的分配代码(实际上,我想创建一个特定的功能来做同样的事情),这里是我是什么能够拿出:C fopen/fwrite驱使我疯狂 - fwrite不写作

#include <stdio.h>           

int openfile(FILE *main, char *name, int option);  

int main(void)            
{               

    FILE *main;           
    int header_init;           
    int result;            

    switch (openfile(main,"main_file.bin",1)) { 
    case 1:            
     header_init = -1;         
     //fseek(main,0,SEEK_SET); --> useless 
     fwrite(&header_init,sizeof(int),1,main);  
     printf("ftell = %d\n",ftell(main)); break;  
    case 2:            
     fread(&header_init,sizeof(int),1,main);   
     printf("%d\n",header_init); break;     
    default:            
     printf("Error trying to open file\n");     
    }              
    printf("header_init is %d\n",header_init);    
    fclose(main); exit(0);        
}               

int openfile(FILE *main, char *name, int option)  
{               
    int result_alloc;          
    int F_OK;            
    if (result_alloc = access (name, F_OK) != 0) {   
    printf("File not found, allocating a new one\n");  
    if ((main= fopen(name,"w+b")) != NULL) return 1; 
    }              
    else {             
    printf("File exist, allocating as r+b\n");  
    if ((main= fopen(name,"r+b")) != NULL) return 2; 
    }           
    printf("Failure trying to open"); 
    return 0;         
}            

由于一些不幸的原因,fwrite操作不写-1到分配的文件。我对这个程序的意图是,它会一直检查该特定文件是否存在:如果有一个文件存在,只需用r + b打开它以允许更新功能而不覆盖实际的文件内容。否则,分配一个头值为-1的新文件(我将把这个文件用作带链接列表结构的记录文件)。

说真的,我不明白为什么这不起作用。这个想法和我以前的计划一样。唯一改变的是我创建了一个函数,因为这会在稍后发生(因为第三个参数可以让我减少我的代码并使它更“易读” - 至少这是意图!) 。我必须承认我对细节问题有一些关注,但我正在努力改进它,我可能在这段代码中错过了一些愚蠢的东西,但是在几个小时看着它之后,我真的很想在这里寻求一些帮助。谢谢

编辑:我在z/Linux下运行它。我想了解的是,为什么上面的代码不向文件写入-1,但下面的代码可以正常写入?

#include <stdio.h>             
int main(void)              
{                 
    FILE *main;              
    int result_alloc;             
    int header_init;             
    int F_OK;               

    if (result_alloc = access ("test.bin", F_OK) != 0) {    
    printf("File not found, allocating a new one\n");    
    if ((main = fopen("test.bin","w+b")) == NULL) {     
     printf("Failure trying to open file");      
     return 1;              
    }                
    else {               
     header_init = -1;            
     printf("current pos is: w+b %d\n",ftell(main));    
     fwrite(&header_init,sizeof(int),1,main);      
     printf("current pos is: write header_init %d\n",ftell(main)); 
    }                
    }                 
    else {               
    if ((main = fopen("test.bin","r+b")) == NULL) {     
     printf("Failure trying to open file");      
     return 2;              
    }                
    else {               
     printf("current pos is: r+b %d\n",ftell(main));    
     fread(&header_init,sizeof(int),1,main);      
     printf("current pos is: read header_init %d\n",ftell(main)); 
    }                
    }                 
}                 
+8

C是传递值。更改被调用者中的函数参数不会更改调用者中的相应参数。此外,你*真的*需要回到基础:'int F_OK;/**/access(name,F_OK);'不会做你认为它的作用。 *做*启用编译器警告。 – EOF

+2

@EOF是正确的:函数'openfile()'的正确原型是'openfile(FILE ** main,char * name,int option)'。它必须由'openfile调用(&main,“main_file.bin”,1)' – francis

+2

您想要了解如何使用调试器,逐步跟踪代码并检查所有相关变量的值。通过这种方式,您可以详细观察发生了什么,并且无需再在黑暗中进行挖掘。 – alk

回答

1

的主要问题,即转让给main变量openfile函数内没有被调用函数可见。因为C是按值传递的,所以只改变函数参数的值,而不是传入的变量的值。因此,当openfile返回时,main函数内部的main变量不变。

你需要做的是将该变量的地址传递给该函数,然后在该函数内解引用局部变量(这是一个指针),并为解除引用的变量赋值。

另外,因为它隐藏了该范围内的功能并且可能导致混淆,所以将某个变量与某个函数的名称相同并不是一个好主意。

int openfile(FILE **fp, char *name, int option); 

你可以这样称呼它(改变main变量的名称fp):

FILE *fp; 
... 
openfile(&fp,"main_file.bin",1) 

随后的openfile

所以,你会如下定义功能,请取消fp以更改呼叫功能中的值:

*fp = fopen(name,"w+b") 

第二个代码示例工作的原因是,您直接分配给局部变量,然后在函数中稍后使用该变量。

而且,你是“幸运”的是代码的第二件工作,因为你这样做:

int F_OK; 

F_OK在unistd.h中,其中access()定义已定义。所以通过这样做,你可以重新声明它,而不是给它一个价值,导致未定义的行为。摆脱这个定义,#include <unistd.h>,并呼吁access()保证按预期工作。

+0

钉住它!现在我懂了。如果这是一个初学者问题,我很抱歉,但我真的想听到某人的消息。这最后的回应刚刚解决了我的问题,并教会了我几件事。当然其他评论也很好,我知道我对C不太好,但希望我能成为专家(某天!)。现在它工作正常!我想通过定义一个函数来适应这种类型的事情,我之前的代码需要很多函数来帮助提高可读性,而这些答案明确地帮助了我。谢谢大家! – Rodrigo