gpt4 book ai didi

C fopen/fwrite 让我发疯 - fwrite 不写

转载 作者:行者123 更新时间:2023-11-30 20:24:34 26 4
gpt4 key购买 nike

好吧,事情是这样的……我记得上周创建了一个程序,要求我以二进制模式打开一个文件并向其中写入数据。首先,我尝试使用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 打开它即可允许更新功能而不覆盖实际文件内容。否则,分配一个新的, header value 为-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));
}
}
}

最佳答案

主要问题是赋值给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()保证按预期工作。

关于C fopen/fwrite 让我发疯 - fwrite 不写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33153199/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com