c - C 中的 fread 和 fwrite

标签 c file binary fwrite fread

我正在尝试编写一个程序来创建和读取一个包含“结构元素”的二进制文件;你能告诉我我做错了什么吗? 我收到错误消息,告诉我“s”不是函数 fread() 中的指针...所以我声明了 ELEM *s;而不是 ELEM;

#include <stdio.h>
#include <stdlib.h>

typedef struct element{
    char name[80];
    int p;
}ELEM;

void create()
{
    FILE *f;
    int d=0;
    char c;
    ELEM *s;
    f=fopen("file.bin","wb");
    do{
    printf("Add elements to file?: (y/n)");
    fflush(stdin);
    scanf("%c",&c);
    if (c=='y')
    {
        printf("Name=");
        gets((*s).name);
        printf("P=");
        scanf("%d",(*s).p);
        fwrite(s,sizeof(ELEM),1,f);
    }
    } while(d==0);
    fclose(f);
}

void show()
{
    FILE *f;
    ELEM *s;
    f=fopen("file.bin","rb");
    while(feof(f)!=NULL)
    {
        fread(s,sizeof(ELEM),1,f);
        puts((*s).name);
        printf("\t%d\n",(*s).p);
    }
    fclose(f);
}

void add()
{
    FILE *f;
    int d=0;
    char c;
    ELEM *s;
    f=fopen("file.bin","ab");
    do{
    printf("Add elements to file?: (y/n)");
    fflush(stdin);
    scanf("%c",&c);
    if (c=='y')
    {
        printf("Name=");
        gets((*s).name);
        printf("P=");
        scanf("%d",(*s).p);
        fwrite(s,sizeof(ELEM),1,f);
    }
    } while(d==0);
    fclose(f);
}


/*void function()
{

}*/

int main()
{
    int k=0,r;
    do{
        printf("1 - create file\n2 - add elements to fil\n3 - show elements\n4 - put unique elements in another file\n5 - exit program\n");
        scanf("%d",&r);
        switch(r)
        {
            case 1 : create(); break;
            case 2 : add(); break;
            case 3 : show(); break;
            case 4 : printf("Function not defined!\n"); break;
            case 5 : k=1; break;
            default : printf("Command unrecognized!\n");
        }
    } while(k==0);
    return 0;
}

最佳答案

您声明了一个指针但没有为其分配内存。您应该恢复为普通变量:

ELEM s;

/* ... */

fwrite(&s,sizeof(ELEM),1,f);
       ^

或者,在您当前的代码中,您应该这样做:

ELEM *s = calloc(1, sizeof *s);

关于c - C 中的 fread 和 fwrite,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9047288/

相关文章:

c++ - C 套接字文件传输损坏的数据

具有相同编译时间选项的两个进程可以在同一台机器上有不同的字节对齐方式吗?

c - 仅让两个进程在 MPI 中执行代码 - 虽然不知道哪些进程将进入代码段

java - 如何使用 Java 读取正在写入的文件?

python - 在Python中读取C数组

oracle - 为什么 (a | b ) 等于 a - (a & b) + b?

c - 如何格式化输出文本,使不同长度的可变字符串排列在多行中?

c++ - 使用多线程将标准输出重定向到文件

c# - 模仿 Windows 默认文件重命名行为的 .Net 方法

C# - 数组转置位级别