好的,这里是交易......我记得上周创建一个程序需要我以二进制模式打开文件并将数据写入它。起初,我尝试使用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));
}
}
}
C是传递值。更改被调用者中的函数参数不会更改调用者中的相应参数。此外,你*真的*需要回到基础:'int F_OK;/**/access(name,F_OK);'不会做你认为它的作用。 *做*启用编译器警告。 – EOF
@EOF是正确的:函数'openfile()'的正确原型是'openfile(FILE ** main,char * name,int option)'。它必须由'openfile调用(&main,“main_file.bin”,1)' – francis
您想要了解如何使用调试器,逐步跟踪代码并检查所有相关变量的值。通过这种方式,您可以详细观察发生了什么,并且无需再在黑暗中进行挖掘。 – alk