我正在制作一个 C / POSIX 程序来处理用文件编写的矩阵。
我希望每个矩阵都用不同的文件写成,格式如下:
因此,例如在具有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
由于我必须测试我的程序,如何创建此类输入文件?
答案 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项目
写出二进制文件要好得多,文件而不是计算机指定格式要好得多。然后便携式阅读。 (浮点数很难,整数有一些陷阱,并不简单)。答案 2 :(得分:0)
这是我对问题的解决方案:我创建了一个程序(matrix_creator
),它接收输出文件path
(argv[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
内的内容。