我正在尝试读取我创建的二进制文件。打印无效,并且打印编号设置为(354),甚至在文件中也没有。我很乐意为您解决问题。
#include <stdio.h>
#include <stdlib.h>
int test();
int main(void) {
FILE *f;
f = fopen("nums.bin", "wb");
srand(40);
for(int i = 0; i<20; i++)
fprintf(f, "%d ", rand()%1000);
printf("Numbers saved to file.\n");
fclose(f);
test();
return 0;
}
int test() {
FILE *f;
int i=0;
printf("The numbers in the file are...\n");
f = fopen("nums.bin", "rb");
fread(&i, sizeof(i), 2, f);
printf("%d", rand()%1000);
return 0;
}
其他所有功能都可以正常使用(文件中的数字与我希望的数字相同,依此类推)。从文件中打印出来有点问题。谢谢
答案 0 :(得分:2)
您将数字写为文本:
fprintf(f, "%d ", rand()%1000);
但是您将数字读为二进制
fread(&i, sizeof(i), 1, f);
这不兼容。
如果使用该 fprintf 进行编写,则必须使用 fscanf 或等同于格式为“%d”的等价字体进行阅读。
要想读fread(&i, sizeof(i), 1, f);
,还需要这样写:
int n = rand()%1000;
fwrite(&n, sizeof(n), 1, f);
除此之外,您的代码中有些奇怪:
printf("The numbers in the file are...\n");
...
fread(&i, sizeof(i), 2, f);
printf("%d", rand()%1000);
所以您读了一个数字(无论采用哪种方式),但是却没有打印,而是打印了一个随机值,为什么不打印 i ?
在printf("The numbers in the file are...\n");
之后,对于 for 来说,似乎与 main 中的逻辑相似,以便从文件中读取值并将其打印在 stdout 上。 em>
以二进制形式写/读的建议:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void test();
int main(void)
{
FILE *f = fopen("nums.bin", "wb");
if (f == 0) {
puts("cannot open file to write in");
return -1;
}
srand(time(NULL)); /* practical way to have different values each time the program runs */
for (int i = 0; i<20; i++){
int n = rand()%1000;
printf("%d ", n); /* to check the read later */
fwrite(&n, sizeof(n), 1, f);
}
printf(" are saved to file.\n");
fclose(f);
test();
return 0;
}
void test() {
FILE *f = fopen("nums.bin", "rb");
if (f == 0) {
puts("cannot open file to read in");
return;
}
printf("The numbers in the file are :\n");
for (int i = 0; i<20; i++){
int n;
fread(&n, sizeof(n), 1, f);
printf("%d ", n);
}
putchar('\n');
fclose(f);
}
示例(值每次都会更改):
pi@raspberrypi:/tmp $ gcc -pedantic -Wall r.c
pi@raspberrypi:/tmp $ ./a.out
208 177 118 678 9 692 14 800 306 629 135 84 831 737 514 328 133 969 702 382 are saved to file.
The numbers in the file are :
208 177 118 678 9 692 14 800 306 629 135 84 831 737 514 328 133 969 702 382
答案 1 :(得分:0)
您的随机化初始化srand(40)
对您的随机数的质量没有影响。通常,您应该使用srand(time(null))
之类的东西来获得更“随机”的东西。
您在test
末尾的输出显示的是随机数,而不是您之前读过的整数。另外,您正在fread(&i, sizeof(i), 2, f);
行中读取两个整数,这将破坏堆栈。