我试图在二进制文件中编写和读取一组int。这两个函数或多或少都是这样的。
int numbers[6]={0, 2, 3, 3, 0, 1};
FILE *file;
if(file=fopen(filename, "wb")==NULL)
{
printf("Something went wrong reading %s\n", filename);
return 0;
}
else
{
int i;
for(i=0; i<6; i++)
fprintf(file, "%d", numbers[i]);
}
fclose(file);
FILE *saved_data;
int errors=0;
if((saved_data=fopen(filename, "rb"))==NULL)
errors++;
else
{
fread(first, sizeof(int), 1, saved_data);
fread(second, sizeof(int), 1, saved_data);
fread(third, sizeof(int), 1, saved_data);
fread(fourth, sizeof(int), 1, saved_data);
fread(fifth, sizeof(int), 1, saved_data);
fread(sixt, sizeof(int), 1, saved_data);
}
fclose(saved_data);
现在,当我调试程序时,调试器告诉我第一个元素是以下
(gdb) print first
$1 = (int *) 0x7fff5fbff968
(gdb) print *first
$2 = 858993200
我无法理解这一点。使用编辑器打开时的文件显示 023301
答案 0 :(得分:4)
fread
的补充功能是fwrite
,而不是fprintf
。你使用fprintf
做的是将整数作为文本放入文件中,而不是二进制文件。
另外,请确保将指针传递给fread
,而不是整数。您没有显示first
,second
等的声明,但是如果您声明了类似
int first, second, third, fourth, fifth, sixt;
然后你需要使用像
这样的代码fread(&first, sizeof(int), 1, saved_data);
而不是
fread(first, sizeof(int), 1, saved_data);
由于你的整数已经在数组中,你可以用
一次编写数组fwrite(numbers, sizeof(int), 6, file);
并完全避免for
循环。
答案 1 :(得分:0)
如果您不反对将文件保留为文本,请将您的fopen更改为以文本形式打开,并更改您的读取语句以将其作为文本阅读。就目前而言,看起来您不一致地将文件视为一个部分中的文本,然后将另一个部分视为二进制文件,这可能会破坏它。