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

时间:2015-06-01 14:48:30

标签: c getline atoi

我必须打开一个文件,其中包含新行中的每个数字。 (表示为字符串)
要读取数据,我需要使用getline()。
要将数据从字符串更改为int,我需要使用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

2 个答案:

答案 0 :(得分:2)

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

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

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

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

您可以使用此功能从fopen返回的文件指针,并根据需要进行打印。

答案 1 :(得分:2)

您不能将L.geoJson用作FILE*的参数。您有以下选择:

  1. 使用writefwrite的签名是:

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

    fileno

    int fileno(const FILE *stream); 的签名是

    write

    您对ssize_t write(int fildes, const void *buf, size_t nbyte); 的使用不正确。您正在传递write,这不是变量的地址。您使用val作为第三个参数。这需要改为:

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

  4. 我的建议是使用fopen。它是标准的C库函数,而fwrite则不是。

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

    "wb"

    在退出之前添加一行以关闭文件。如果您使用FILE *fd = fopen("test.bin", "wb"); 打开文件,请使用fopen关闭它。如果您使用fclose打开文件,请使用open将其关闭。