【问题标题】:How to efficiently save an array of longs to a custom file如何有效地将长数组保存到自定义文件中
【发布时间】:2021-03-24 15:59:33
【问题描述】:

我有一个 long 值数组,我想将它们保存到一个名为“Longs.myData”的文件中。我希望我的文件大小为 24 字节,因为该数组只有 3 个索引。但是,我得到一个 192 字节的文件。有没有办法保存我的数据并获得一个占用 24 个字节的文件? P.S 我知道将文件保存为 .txt 文件大小为 33 个字节。谢谢!

 #include <stdio.h>
 #include <stdlib.h>    

void CreateFile()
{
    //Array containing my data
    long data[3];
    data[0] = 2147483644;
    data[1] = 2147483645;   
    data[2] = 2147483646;   
    
    //Initializing a pointer to FILE
    FILE *myFilePointer;
    
    //Creating a new file "Longs.myData"
    myFilePointer = fopen("Longs.myData", "wb");
    
    //Error handling
    if(myFilePointer == NULL){exit(1);}
    
    //Save array to file
    fwrite(data, sizeof(long), sizeof(data), myFilePointer);
    
    //sizeof(long) = 8, sizeof(data) = 24 //Total 192
    printf("%d %d \n", (int) sizeof(long), (int) sizeof(data));
    fclose(myFilePointer);
    
}

int main()
{
    CreateFile();
    return 0;
}

【问题讨论】:

  • fwrite() 将写入 x 项数据,每个 y 字节大小。 sizeof(data) == sizeof(long)*3,因此您有效地将 sizeof(long) * sizeof(long) * 3 字节写入文件,这可能会或可能不会出现段错误。
  • 这个question / answer 解决了这个话题。如果我错了,请纠正我。

标签: arrays c file file-io save


【解决方案1】:

在此声明中:

long data[3];  

data 的所有三个元素的内存被创建为一个连续的块。并且根据fwrite() 的以下原型的第二个和第三个参数,

size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream)  
  1. size - 这是要写入的每个元素的字节大小。
  2. nmemb - 这是元素的数量,每个元素的大小为 size 字节。

写入的总字节数由参数 2 和 3 相乘得出。

所以在以下语法中,组合参数只是表示太多字节:

fwrite(data, sizeof(long), sizeof(data), myFilePointer);

打破它...
要写入的总字节数由下式给出

sizeof(long)*sizeof(data)
//    8     *    3 * 8  (sizeof(data) == 3 array elements*sizeof(long))
//    8     *      24  = 192

sizeof(long) 的 1 个因子太多。如果sizeof(long) == 8,那么数学是:

可以通过多种方式编写参数以获得正确的计数。使用char (byte) 作为基本元素,并给出sizeof(char) is always 1

fwrite(data, 1, sizeof(data), myFilePointer);
//           1    3*sizeof(long) ==>  1*3*8   == 24 
 

使用long作为基本元素,数组大小(3)作为元素个数

fwrite(data, sizeof(long), sizeof(data)/sizeof(data[0]), myFilePointer);
//               8                3  ==>  8*3 == 24

顺便说一句:虽然不是必需的,但在处理二进制文件时最好使用无符号类型:

“无符号用于避免带符号的[算术]妨碍,因为它最能代表二进制内容(0到255之间的值)”

(from here)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多