【问题标题】:How can I write both an array of int and array of char to a file如何将 int 数组和 char 数组写入文件
【发布时间】:2012-11-16 19:51:51
【问题描述】:

我试图在二进制文件中写入和读取整数数组。这两个函数或多或少是这样的。

保存功能

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

【问题讨论】:

    标签: c io


    【解决方案1】:

    fread 的互补功能是fwrite,而不是fprintf。您对fprintf 所做的是将整数作为文本而不是二进制放入文件中。

    另外,请确保传递指向fread 的指针,而不是整数。你不显示firstsecond 等的声明,但如果你声明了类似的东西

    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 循环。

    【讨论】:

      【解决方案2】:

      如果您不反对将文件一直保留为文本,请将您的 fopen 更改为以文本形式打开,并更改您的 read 语句以将它们作为文本读入。就目前而言,您似乎不一致地将文件在一部分中视为文本,然后在另一部分中视为二进制,这可能会损坏它。

      【讨论】:

      • 如果您使用全文本,您将需要分隔符或其他东西。除非您知道所有整数都是个位数,否则无法判断您的文件不包含单个数字 23,301。 :)
      • 同意。我假设 OP 知道这一点,但我不应该做出这样的假设。很好的收获。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      • 1970-01-01
      • 2020-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多