C fopen / fwrite让我疯狂 - 不写作

时间:2015-10-15 15:57:15

标签: c fopen fwrite

好的,这是交易...我记得上周创建了一个程序,要求我以二进制模式打开文件并向其写入数据。首先,我尝试使用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的新文件(我将此文件用作具有链式列表结构的记录文件)。

说真的,我无法理解为什么这不起作用。这个想法与我以前的计划相同。唯一改变的是我创建了一个函数,因为这将在以后发生(因为第三个参数将允许我减少我的代码并使其更多&#34;可读&#34; - 至少这个是意图!)。我必须承认我对细节问题有一些关注,但我正在努力改进它,我可能在这段代码中遗漏了一些愚蠢的东西,但是看了几个小时后我真的想在这里问一些帮助。感谢

编辑:我在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)); 
    }                                                              
  }                                                                
}                                                                  

1 个答案:

答案 0 :(得分: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")

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

另外,你很幸运&#34;第二段代码正在运行,因为你这样做了:

int F_OK;

F_OK已在unistd.h中定义,其中定义了access()。因此,通过执行此操作,您可以重新声明它而不是为其赋值,从而导致未定义的行为。摆脱这个定义,并#include <unistd.h>,保证对access()的调用按预期工作。