C中的write()写入文件的额外字符串

时间:2014-04-16 22:57:42

标签: c string binary

我写了一个玩具程序来学习如何将二进制文件写入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来测试它的可能性。

3 个答案:

答案 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格式查看二进制输出。

希望有所帮助。