C程序读写二进制文件
C program reading and writing to binary files
你好,这是我第一次在 C 中使用二进制文件。
我试图先将数据写入文件,然后再从文件中读取相同的数据。但不知何故,我没有正确读取数据(我就是这么认为的),因为我认为文件写入部分没有问题。我正在 unix 中完成所有这些工作。
所以基本上我试图在 unix 中写入和读取二进制文件中的数据,但我无法正确读取数据。任何帮助,将不胜感激。提前致谢。
我附上了下面的代码和输出,这样就可以理解了:
#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <sys/stat.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
char data[100];
if(argc<2){
printf("Usage: gift <textstring>\n");
return -1;
}
int n = 0;
int num = 0;
char data[100];
if(argc<2){
printf("Usage: gift <textstring>\n");
return -1;
}
int n = 0;
int num = 0;
int fd = open("gifts.dat", O_CREAT | O_WRONLY | O_RDONLY);
if((strcmp(argv[1],"new"))==0){
for(int i = 2; i < argc; i = i+2){
int number = atoi(argv[i+1]);
strcpy(data, argv[i]);
int length = strlen(data) + 1;
write(fd,&length, sizeof(int));
write(fd,data, length);
write(fd,&number, sizeof(int));
}
}
else{
printf("Not worked");
}
for(int k =0;k < ((argc-2)/2);k++){
int length;
char*name = NULL;
int money;
read(fd, &length, sizeof(int));
name = malloc(length);
read(fd, name, length);
read(fd, &money, sizeof(int));
printf("%10s: %.2f\n", name, money);
}
return 0;
}
然后这是二进制文件的输出
gcc -o gifts board.c
./gifts new patel 200 Ram 500
: 0.00
: 0.00
od -c gifts.dat
0000000 006 [=11=] [=11=] [=11=] p a t e l [=11=] 310 [=11=] [=11=] [=11=] 004 [=11=]
0000020 [=11=] [=11=] R a m [=11=] 364 001 [=11=] [=11=] [=11=] [=11=]
0000034
cat gifts.dat
patelÈRamô{cslinux1:~/CS3377_hmb180006}
确保在使用 gcc
编译之前使用 alias gcc='gcc -std=c99'
主要问题出在您的 open()
电话上。您试图同时以 只读 和 只写 打开文件。来自 man 2 打开:
The argument flags must include one of the following access
modes: O_RDONLY
, O_WRONLY
, or O_RDWR
.
按如下方式重构您的代码可以正常工作。
char data[100];
int fd = open ("gifts.dat", O_CREAT | O_WRONLY);
int n = 0;
if ((strcmp(argv[1],"new")) == 0) {
for (int i = 2; i < argc; i = i+2){
int number = atoi (argv[i+1]);
strcpy (data, argv[i]);
int length = strlen(data) + 1;
write (fd, &length, sizeof(int));
write (fd, data, length);
write (fd, &number, sizeof(int));
n++;
}
}
else{
printf("Not worked");
}
close (fd);
fd = open ("gifts.dat", O_CREAT | O_RDONLY);
for (int k = 0; k < n; k++){
int length;
char name[100];
int money;
read (fd, &length, sizeof(int));
read (fd, name, length);
read (fd, &money, sizeof(int));
printf("%10s: %.2d\n", name, money);
}
close (fd);
例子Use/Output
$ ./bin/readwrite_bin new patel 200 Ram 500
patel: 200
Ram: 500
此外,您必须通过检查每个调用的 return 来验证所有打开、读取、写入(以及写入后关闭)以确保成功,或者在失败时处理任何错误。您应该将 atoi()
替换为至少 sscanf()
或更好的 strtol()
,因为 atoi()
提供零错误检测并且很乐意接受 atoi ("my cow");
如果您还有其他问题,请告诉我。
你好,这是我第一次在 C 中使用二进制文件。
我试图先将数据写入文件,然后再从文件中读取相同的数据。但不知何故,我没有正确读取数据(我就是这么认为的),因为我认为文件写入部分没有问题。我正在 unix 中完成所有这些工作。
所以基本上我试图在 unix 中写入和读取二进制文件中的数据,但我无法正确读取数据。任何帮助,将不胜感激。提前致谢。
我附上了下面的代码和输出,这样就可以理解了:
#include <stdio.h>
#include <sys/types.h>
#include <fcntl.h>
#include <unistd.h>
#include <string.h>
#include <sys/stat.h>
#include <stdlib.h>
int main(int argc, char *argv[]){
char data[100];
if(argc<2){
printf("Usage: gift <textstring>\n");
return -1;
}
int n = 0;
int num = 0;
char data[100];
if(argc<2){
printf("Usage: gift <textstring>\n");
return -1;
}
int n = 0;
int num = 0;
int fd = open("gifts.dat", O_CREAT | O_WRONLY | O_RDONLY);
if((strcmp(argv[1],"new"))==0){
for(int i = 2; i < argc; i = i+2){
int number = atoi(argv[i+1]);
strcpy(data, argv[i]);
int length = strlen(data) + 1;
write(fd,&length, sizeof(int));
write(fd,data, length);
write(fd,&number, sizeof(int));
}
}
else{
printf("Not worked");
}
for(int k =0;k < ((argc-2)/2);k++){
int length;
char*name = NULL;
int money;
read(fd, &length, sizeof(int));
name = malloc(length);
read(fd, name, length);
read(fd, &money, sizeof(int));
printf("%10s: %.2f\n", name, money);
}
return 0;
}
然后这是二进制文件的输出
gcc -o gifts board.c
./gifts new patel 200 Ram 500
: 0.00
: 0.00
od -c gifts.dat
0000000 006 [=11=] [=11=] [=11=] p a t e l [=11=] 310 [=11=] [=11=] [=11=] 004 [=11=]
0000020 [=11=] [=11=] R a m [=11=] 364 001 [=11=] [=11=] [=11=] [=11=]
0000034
cat gifts.dat
patelÈRamô{cslinux1:~/CS3377_hmb180006}
确保在使用 gcc
编译之前使用alias gcc='gcc -std=c99'
主要问题出在您的 open()
电话上。您试图同时以 只读 和 只写 打开文件。来自 man 2 打开:
The argument flags must include one of the following access modes:
O_RDONLY
,O_WRONLY
, orO_RDWR
.
按如下方式重构您的代码可以正常工作。
char data[100];
int fd = open ("gifts.dat", O_CREAT | O_WRONLY);
int n = 0;
if ((strcmp(argv[1],"new")) == 0) {
for (int i = 2; i < argc; i = i+2){
int number = atoi (argv[i+1]);
strcpy (data, argv[i]);
int length = strlen(data) + 1;
write (fd, &length, sizeof(int));
write (fd, data, length);
write (fd, &number, sizeof(int));
n++;
}
}
else{
printf("Not worked");
}
close (fd);
fd = open ("gifts.dat", O_CREAT | O_RDONLY);
for (int k = 0; k < n; k++){
int length;
char name[100];
int money;
read (fd, &length, sizeof(int));
read (fd, name, length);
read (fd, &money, sizeof(int));
printf("%10s: %.2d\n", name, money);
}
close (fd);
例子Use/Output
$ ./bin/readwrite_bin new patel 200 Ram 500
patel: 200
Ram: 500
此外,您必须通过检查每个调用的 return 来验证所有打开、读取、写入(以及写入后关闭)以确保成功,或者在失败时处理任何错误。您应该将 atoi()
替换为至少 sscanf()
或更好的 strtol()
,因为 atoi()
提供零错误检测并且很乐意接受 atoi ("my cow");
如果您还有其他问题,请告诉我。