无法关闭 C 中的二进制文件

标签 c file binary

我尝试编写一个程序,从键盘读取 ELEM 结构并将其写入文件 (file.bin),然后将唯一项写入另一个文件 (aux.bin)。问题是它无法关闭 void function() 中打开的文件,你能告诉我我做错了什么吗?

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

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

void clear_stdin()
{
    char str[255];
    fgets(str,255,stdin);
}

int create()
{
    FILE *f;
    int d=0;
    int c;
    int n=0;
    ELEM s;
    f=fopen("file.bin","wb");
    if(f==NULL)
    {
        printf("create(): Could not open file.bin for read\n");
        return;
    }
    do{
    printf("Add elements to file?:\n1 - yes\n2 - no\n");
    scanf("%d",&c);
    if (c==1)
    {
        printf("Name=");
        clear_stdin();
        fgets(s.name,80,stdin);
        printf("P=");
        scanf("%d",&s.p);
        fwrite(&s,sizeof(ELEM),1,f);
        n++;
    }
    else
        d=1;
    } while(d==0);
    fclose(f);
    return n;
}

void show(int n)
{
    FILE *f;
    ELEM s;
    int i=0;
    if(n==0)
        return;
    f=fopen("file.bin","rb");
    while(i<n)
    {
        fread(&s,sizeof(ELEM),1,f);
        puts(s.name);
        printf("\t%d\n",s.p);
        i++;
    }
    fclose(f);
}

int add(int n)
{
    FILE *f;
    int d=0;
    int c;
    ELEM s;
    f=fopen("file.bin","ab");
    if(f==NULL)
    {
        printf("add(): Could not open file.bin for append\n");
        return;
    }
    do{
    printf("Add elements to file?:\n1 - yes\n2 - no\n");
    scanf("%d",&c);
    if (c==1)
    {
        printf("Name=");
        clear_stdin();
        fgets(s.name,80,stdin);
        printf("P=");
        scanf("%d",&s.p);
        fwrite(&s,sizeof(ELEM),1,f);
        n++;
    }
    else
        d=1;
    } while(d==0);
    fclose(f);
    return n;
}


void func(int n)
{
    FILE *f,*g;
    ELEM v[20],w;
    int i=0,j,k,x=0,s,gn=0,test;
    f=fopen("file.bin","rb");
    g=fopen("aux.bin","wb");
    if((g==NULL)||(f==NULL))
    {
        if(g==NULL)
            printf("function() : Could not open aux.bin for write\n");
        if(f==NULL)
            printf("function() : Could not open file.bin for read\n");
        return;
    }
    i=0;
    while(i<n)
    {
        fread(&v[i],sizeof(ELEM),1,f);

        i++;
    }
    for(j=0;j<n;j++)
    {
        for(k=j+1;k<n;k++)
        {
            if(v[j].p==v[k].p)
                x=1;

        }
        if(x==0)
        {
            s=strcmp(v[j].name,v[k].name);
            if(s!=0)
            {
                fwrite(&v[j],sizeof(ELEM),1,g);
                fread(&w,sizeof(ELEM),1,g);

                gn++;
            }
        }
        x=0;
    }
    test=fclose(g);
    if(test!=0)
        printf("function() : failed to closed file g\n");
    test=fclose(f);
    if(test!=0)
        printf("function() : failed to closed file f\n");
    g=fopen("aux.bin","rb");
    if(g==NULL)
    {
        printf("function() : Could not open aux.bin for read\n");
        return;
    }
    if(gn==0)
        return;
    i=0;
    while(i<gn)
    {
        fread(&w,sizeof(ELEM),1,g);
        puts(w.name);
        printf("\t%d\n",w.p);
        i++;
    }
    fclose(g);
}

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

编辑: 我编辑了代码

aux.bin 从未创建,这就是为什么它卡住在 fread(&w,sizeof(ELEM),1,g); 但为什么它不能创建 aux.bin ? 我没有收到任何错误消息,但当我打开项目文件夹时,只有 file.bin。


编辑: 我从 MinGW 和 Visual Studio 切换到 gcc,现在它创建了这两个文件,除了 fflush(stdin) 之外,一切正常。我将 gets(s.name); 替换为 fgets(s.name,80,stdin);


编辑: 我用一个清除 stdin 的函数替换了 fflush(stdin),现在它可以与 Linux 中的 gcc 完美配合。 在 Windows 中它不起作用。

最佳答案

您似乎期望关闭文件时文件句柄指针变为NULL,但事实并非如此。

请注意,fclose() 函数接受指针(FILE * 类型的参数),因此它获得的只是指针的值,它不能 改变调用者的指针。为了实现这一点,您必须使用 FILE ** 来调用它,即指向指针的指针。

如果(且仅当)fclose() 表示,您有责任在调用 fclose() 后将指针设置为 NULL它成功了,返回 0。请参阅 the manual page了解详情。

关于无法关闭 C 中的二进制文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9129399/

相关文章:

c - 为什么我的最小值和最大值为 0?

file - 在 PhpStorm 中搜索远程主机上的所有项目文件

c - 文本区域的大小

c - 运行时生成的printf参数

iOS iPod API - 获取实际的歌曲文件

c++ - 整数和位数组之间的按位运算

Ruby TCPSocket 发送/接收二进制数据 -> 数组哈希等

c - 使用C中的内存映射读取二进制文件

java - C 客户端套接字数据无法在 Java 服务器中读取

java - 如何创建独立的 SQL DB 文件以与我的 java 聊天应用程序一起使用?