将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
的参数。您有以下选择:
使用fwrite
。 fwrite
的签名是:
size_t fwrite( const void *buffer, size_t size, size_t count,
FILE *stream );
使用函数 fileno
从 FILE*
获取文件描述符并使用 write
。 fileno
的签名是:
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));
使用open
代替fopen
。
我的建议是使用 fwrite
。它是一个标准的 C 库函数,而 write
不是。
此外,请确保以二进制模式打开文件。不要使用 "w+"
,而是使用 "wb"
.
FILE *fd = fopen("test.bin", "wb");
添加一行在退出前关闭文件。如果您使用 fopen
打开文件,请使用 fclose
关闭它。如果您使用 open
打开文件,请使用 close
关闭它。
我必须打开一个文件,其中包含新行中的每个数字。 (表示为字符串)
要读取数据,我需要使用 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
的参数。您有以下选择:
使用
fwrite
。fwrite
的签名是:size_t fwrite( const void *buffer, size_t size, size_t count, FILE *stream );
使用函数
fileno
从FILE*
获取文件描述符并使用write
。fileno
的签名是: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));
使用
open
代替fopen
。
我的建议是使用 fwrite
。它是一个标准的 C 库函数,而 write
不是。
此外,请确保以二进制模式打开文件。不要使用 "w+"
,而是使用 "wb"
.
FILE *fd = fopen("test.bin", "wb");
添加一行在退出前关闭文件。如果您使用 fopen
打开文件,请使用 fclose
关闭它。如果您使用 open
打开文件,请使用 close
关闭它。