将int写入C中的二进制文件

Write int to binary file in C

我必须打开一个文件,其中包含新行中的每个数字。 (表示为字符串)
要读取数据,我需要使用 getline()。
要将数据从字符串更改为整数,我需要使用 atoi()。
要将更改的数据写入文件,我需要使用 write()。

我设法做到的是:

#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>

int main()
{
    FILE *stream;
    stream = fopen("stevila.txt", "r");

    FILE *fd = fopen("test.bin", "w+");

    char *line = NULL;
    size_t len = 0;
    ssize_t read;
    int a=10;
    char str[8192];


    while ((read = getline(&line, &len, stream)) != -1) {
        strcpy(str, line);
        int val = atoi(str);
        write(fd, val, a);
    }

    free(line);
    fclose(stream);
}

编辑:
多亏了答案,我设法创建了一个有效的程序:

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

int main()
{
    FILE *f = fopen("text.txt","r");

    mode_t mode = S_IRUSR | S_IWUSR; /* Allow user to Read/Write file */
    int fd = open("out.bin",O_WRONLY|O_CREAT|O_TRUNC,mode);

    if (f==NULL) {
        perror("Error while opening 'text.txt' ");
        return -1;
    }
    if(fd < 0){
        perror("Error while opening 'out.bin' ");
        return -1;
    }

    size_t max_size=64;
    char* line;
    line=malloc(max_size);

    int d;
    while ((d=getline(&line, &max_size, f))!=-1)
    {
        int tmp=atoi(line); /* Change string to int and save it to tmp */
        if(write(fd,&tmp,sizeof(tmp)) == -1)
        {
            perror("Error while writing data ");
            break;
        }
    }

    fclose(f);
    close(fd);
    free(line);

    return 0;
}

现在我们可以在终端运行这个命令,看看输出文件是否符合预期:

od -i out.bin

write 采用文件描述符而不是文件指针。 例如在 linux O/S 上。

http://linux.die.net/man/2/write

为什么不直接使用 fwrite 函数来做你需要的事情

http://www.cplusplus.com/reference/cstdio/fwrite/

您可以将 fopen 返回的文件指针与此函数一起使用,并根据需要打印。

您不能使用 FILE* 作为 write 的参数。您有以下选择:

  1. 使用fwritefwrite的签名是:

    size_t fwrite( const void *buffer, size_t size, size_t count,
                   FILE *stream );
    
  2. 使用函数 filenoFILE* 获取文件描述符并使用 writefileno的签名是:

    int fileno(const FILE *stream);
    

    write的签名是

    ssize_t write(int fildes, const void *buf, size_t nbyte);
    

    您对 write 的使用不正确。您正在传递 val,这不是变量的地址。您正在使用 a 作为第三个参数。需要改为:

    write(fd, &val, sizeof(val));
    
  3. 使用open代替fopen

我的建议是使用 fwrite。它是一个标准的 C 库函数,而 write 不是。

此外,请确保以二进制模式打开文件。不要使用 "w+",而是使用 "wb".

FILE *fd = fopen("test.bin", "wb");

添加一行在退出前关闭文件。如果您使用 fopen 打开文件,请使用 fclose 关闭它。如果您使用 open 打开文件,请使用 close 关闭它。