Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 试图从文件打印结构的动态数组_C - Fatal编程技术网

C 试图从文件打印结构的动态数组

C 试图从文件打印结构的动态数组,c,C,因此,基本上,我正在尝试编写一个程序: 读取未知大小的结构的动态数组 将其写入文件 在屏幕上打印 所有这些都需要使用不同的函数和结构的动态数组。这是我正在编写的代码;打印功能无法正常工作,似乎在所有操作过程中数据丢失:/能否有人告诉我如何修复此问题 #include <stdio.h> #include <stdlib.h> #include <string.h> #define FILE_CARS "cars.txt" typedef

因此,基本上,我正在尝试编写一个程序:

  • 读取未知大小的结构的动态数组
  • 将其写入文件
  • 在屏幕上打印
  • 所有这些都需要使用不同的函数和结构的动态数组。这是我正在编写的代码;打印功能无法正常工作,似乎在所有操作过程中数据丢失:/能否有人告诉我如何修复此问题

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    #define FILE_CARS "cars.txt"
    
    typedef struct car 
    {
        long int id;
        char name[100];
    }Car;
    
    void reading(Car *vec){
    
        printf("ID: ");
        scanf("%d", &vec->id);
        printf("Name: ");
        scanf(" %[^\n]", vec->name);
    
        FILE *fab = fopen(FILE_CARS, "ab+");
        fwrite(&vec, sizeof(Car), 1, fab);
        fclose(fab);
    }
    
    void printing(Car *vec){
    
        //vec = (Car*) malloc(sizeof(Car));
    
        FILE *fr = fopen(FILE_CARS, "rb");
    
        while(fread(vec, sizeof(Car), 1, fr)){
            printf("\nID: %d\n", vec->id);
            printf("Name: %s\n", vec->name);
        }
    
        fclose(fr);
    }
    
    
    int main(){
        int op;
    
        Car *vec = (Car*) malloc (sizeof(Car));
        
        do{
            scanf("%d", &op);
    
            switch(op){
                case 1:
                    reading(vec);
                    break;
                case 2:
                    printing(vec);
                    break;
                case 3:
                    printf("End of program");
                    break;
                default:
                    printf("invalid option");
            }
    
        }while(op != 3);
    }
    
    #包括
    #包括
    #包括
    #定义文件_CARS“CARS.txt”
    结构车
    {
    长int-id;
    字符名[100];
    }汽车;
    无效读数(Car*vec){
    printf(“ID:”);
    scanf(“%d”和&vec->id);
    printf(“名称:”);
    scanf(“%[^\n]”,vec->name);
    FILE*fab=fopen(FILE_CARS,“ab+”);
    fwrite&vec,sizeof(Car),1,fab;
    fclose(fab);
    }
    作废打印(Car*vec){
    //vec=(Car*)malloc(sizeof(Car));
    文件*fr=fopen(文件“rb”);
    while(fread(vec,sizeof(Car),1,fr)){
    printf(“\nID:%d\n”,vec->id);
    printf(“名称:%s\n”,向量->名称);
    }
    fclose(fr);
    }
    int main(){
    int op;
    Car*vec=(Car*)malloc(sizeof(Car));
    做{
    scanf(“%d”和&op);
    开关(op){
    案例1:
    阅读(vec);
    打破
    案例2:
    印刷(vec);
    打破
    案例3:
    printf(“课程结束”);
    打破
    违约:
    printf(“无效期权”);
    }
    }而(op!=3);
    }
    
    在行中

    fwrite(&vec, sizeof(Car), 1, fab);
    
    您正在将指针写入文件,这将是无用的。 这也是危险的,因为
    sizeof(Car)
    通常大于指针,并且会发生越界读取

    请使用不带
    的此行:

    fwrite(vec, sizeof(Car), 1, fab);
    

    你正在写指针。。。
    vec
    不是指针吗?i、 e.
    &vec
    将是指向指针的指针(即相当于原型中的
    Car**
    ,这是错误的),并且应该抛出编译器错误。@ryker
    vec
    是指向
    Car
    数据的指针
    &vec
    是指向
    Car*
    数据的指针。两者都是指针。
    fwrite
    的第一个参数是
    const void*
    ,它接受任何指针。因此不会抛出编译器错误
    fwrite
    将写入传递的指向文件的指针所指向的内容。