我写了一个玩具程序来学习如何将二进制文件写入C中的文件。我有以下程序将整数1和字符串“hello”写入名为“my_log.txt”的文件中,但是文件'写完后,my_log.txt'包含以下内容:hellowrhellowrhellowrhellowrhellowr
我想知道为什么缺少整数(1),额外的字符串“wr”来自哪里?
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <fcntl.h>
int main()
{
char *filename = "my_log.txt";
char *content = "hello";
int i;
int filedescriptor = open(filename, O_RDWR | O_APPEND | O_CREAT);
for (i = 0; i < 5; i++)
{
printf("written %d \n", i);
write(filedescriptor, &i, sizeof(int));
write(filedescriptor, content, sizeof(content));
}
close(filedescriptor);
return 0;
}
我知道如何使用fopen / fwrite将二进制文件写入文件,但我只是在C中使用open / write来测试它的可能性。
答案 0 :(得分:2)
我在CodeBlocks(Win版本)中尝试 - 将整数转换为字符串。 我找不到以“binay模式”打开写入的方法。在这种情况下不要使用sizeof(),请尝试使用strlen()函数来通知字符串的大小。输出:0hello1hello2hello3hello4hello ---但是如果你想要hello0hello1hello ...改变write()函数的顺序。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <fcntl.h>
#include <sys/stat.h>
int main()
{
char *filename = "my_log.txt";
char *content = "hello";
char buf[10];
int i;
int filedescriptor = open(filename, O_RDWR | O_APPEND | O_CREAT);
for (i = 0; i < 5; i++)
{
printf("written %d \n", i);
itoa(i,buf,10);
write(filedescriptor, buf, strlen(buf));
write(filedescriptor, content, strlen(content));
}
close(filedescriptor);
return 0;
}
答案 1 :(得分:1)
您可以更改以下行:
char *content = "hello";
到
char content[] = "hello";
然后是行中的sizeof(content)
:
write(filedescriptor, content, sizeof(content));
将产生足够的空间(6个字节)来写出content
(hello \ 0)的整个长度而不是仅仅四个字节。
(即在原始代码中,sizeof(内容)== sizeof(char *)== 4)
答案 2 :(得分:0)
你可能只是没有看到你认为你所看到的 在我的系统上运行程序会产生:
user@user-vm:~$ hexdump -C my_log.txt
00000000 00 00 00 00 68 65 6c 6c 01 00 00 00 68 65 6c 6c |....hell....hell|
00000010 02 00 00 00 68 65 6c 6c 03 00 00 00 68 65 6c 6c |....hell....hell|
00000020 04 00 00 00 68 65 6c 6c |....hell|
00000028
正如您所看到的,您的整数是一个二进制整数(不是ASCII值),范围从0到4,这是您指示它做的。
另外,正如BLUEPIXY所提到的,sizeof(content)将返回4,因为char *在大多数系统上都是4个字节,因此你只能写出“hello”的前4个字节。
尝试使用像hexdump这样的实用程序以ASCII格式查看二进制输出。
希望有所帮助。