保存后从C中的二进制文件读取

时间:2019-01-27 20:45:59

标签: c binary

我正在尝试读取我创建的二进制文件。打印无效,并且打印编号设置为(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;
}

其他所有功能都可以正常使用(文件中的数字与我希望的数字相同,依此类推)。从文件中打印出来有点问题。谢谢

2 个答案:

答案 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);行中读取两个整数,这将破坏堆栈。