好的,这是交易...我记得上周创建了一个程序,要求我以二进制模式打开文件并向其写入数据。首先,我尝试使用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));
}
}
}
答案 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()
的调用按预期工作。