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");

如果您还有其他问题,请告诉我。