如何创建一个字节文件?

时间:2017-01-06 16:22:34

标签: c file endianness

我正在制作一个 C / POSIX 程序来处理用文件编写的矩阵。

我希望每个矩阵都用不同的文件写成,格式如下:

  1. 所有数字均以字节序列写入计算机的 endiannes 之后
  2. 所有数字都写在文件逐行
  3. 因此,例如在具有32位int little-endian 计算机中,使用以下矩阵:

    | 100 200 |
    | 300 400 |
    | 500 600 |
    

    将存储在我们可以表示的字节序列中(其中每个数字代表相应字节的十进制值):

    100 0 0 0 200 0 0 0 44 1 0 0 244 1 0 0 88 2 0 0
    

    由于我必须测试我的程序,如何创建此类输入文件

3 个答案:

答案 0 :(得分:4)

此代码:

int main(int argc, char* argv[])
{
   FILE *fp;
   fopen_s(&fp, "testfile.dat", "wb");
   int i[] = { 100, 200, 300, 400, 500, 600 };
   fwrite(i, sizeof(i), 1, fp);
   fclose(fp);
   return 0;
}

在Visual Studio的二进制编辑器中给我一个看起来像这样的文件:

64 00 00 00 C8 00 00 00 2C 01 00 00 90 01 00 00
F4 01 00 00 58 02 00 00

答案 1 :(得分:3)

您只需写出数据

 int x = testvalue;
 fwrite(&x, 1, sizeof(int), fp);

然而,Posix规范很糟糕。如果int的宽度或计算机的字节顺序发生更改,则文件会中断。这似乎是必需的行为。

查看我的二进制文件可移植性的github项目

https://github.com/MalcolmMcLean/ieee754

写出二进制文件要好得多,文件而不是计算机指定格式要好得多。然后便携式阅读。 (浮点数很难,整数有一些陷阱,并不简单)。

答案 2 :(得分:0)

这是我对问题的解决方案:我创建了一个程序(matrix_creator),它接收输出文件pathargv[1])的参数以及它需要写入的所有数字输出文件(argv[2]argv[3],...)。

我排除了所有错误控件以使代码更易于阅读:

int fd = open(path, O_RDWR|O_CREAT, 0644); // Create output file
for(int i = 2; i < argc; i++) { // Starts from argv[2]
    int t = strtol(argv[i], NULL, 0); // Parse each input number
    write(fd, &t, sizeof(t)); // Write the number in the given format
}
close(fd);

通过这种方式,我可以使用相同的程序为多次测试创建不同的文件

检查我安装的文件ghex内的内容。