Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/66.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> typedef struct { char CNP[14];// CNP = Personal Identification Number char nume[30]; // nume=name int

我在二进制文件中有三条记录。当我修改一条记录并打开具有可读记录的文本文件时,具有修改名称的记录只是复制,没有任何更改。此外,有时控制台会说该记录不存在,即使它存在。前两个子程序用于创建二进制文件和包含二进制文件记录的文本文件

#include<stdio.h>
typedef struct {
    char CNP[14];// CNP = Personal Identification Number
    char nume[30]; // nume=name
    int an;        // an=year
    int grupa;     // grupa=group
    int nrDisc;    // nrDisc=number of classes           
    int note[20];  // note=grades
}STUDENT;

void creare(char*nume) {       // creare=creation
    FILE*f;
    STUDENT s;
    fopen_s(&f, nume, "wb");
    if (!f)
        printf("Eroare");
    else {
        printf("CNP:");
        gets(s.CNP);
        while (!feof(stdin)){
            printf("Nume:");
            gets(s.nume);
            printf("An:");
            scanf_s("%d", &s.an);
            printf("Grupa:");
            scanf_s("%d", &s.grupa);
            printf("Nr. discipline:");
            scanf_s("%d", &s.nrDisc);
            for (int i = 0; i < s.nrDisc; i++)
            {
                printf("Nota[%d] este:", i);
                scanf_s("%d", &s.note[i]);
            }
            fwrite(&s, sizeof(s), 1, f);
            getchar();
            printf("CNP:");
            gets(s.CNP);
        }
        fclose(f);
    }
}


void raport(char*nume_binar, char*nume_text) {   // raport=report
    FILE*f;
    fopen_s(&f, nume_binar, "rb");
    if (!f)
        printf("Eroare");
    else {
        FILE*g;
        STUDENT s;
        fopen_s(&g, nume_text, "w");
        fprintf(g,"     CNP             Nume           An       Grupa    Nr discipline\n\n");
        while(fread(&s, sizeof(s), 1, f)==1)
         {          
            fprintf(g,"%s   %s  %5d  %9d  %9d\n", s.CNP, s.nume, s.an, s.grupa, s.nrDisc);
            for (int i = 0; i < s.nrDisc; i++)
            {
                fprintf(g, "Nota %d este:", i);
                fprintf(g, "%d\n", s.note[i]);

            }
            fprintf(g, "\n");
        }

        fclose(g);

    }
    fclose(f);
}


void modificare(char*nume) {  // modificare=modifying
    FILE*f;
    STUDENT s;
    int grupa;
    fopen_s(&f, nume, "rb+");
    if (!f)
        printf("Eroare");
    else {
        printf("Grupa:");
        scanf_s("%d", &grupa);
        while (!feof(stdin)) {
            int g=0;
            char nume[20];
            fread(&s, sizeof(s), 1, f);
            if (grupa == s.grupa) {
                g = 1;
                printf("Numele initial este:%s\n", s.nume);
                printf("Noul nume este:");
                getchar();
                gets(nume);
                fseek(f,ftell(f)-sizeof(s), 0);
                fwrite(&s, sizeof(s), 1, f);
            }

            if (g == 0)
                printf("Nu exista\n");

            printf("Grupa:");
            scanf_s("%d", &grupa);


        }
        fclose(f);

    }
}

void main() {
    char nume_fisier[] = "Student.dat";
    char nume_fisier_txt[] = "Raport.txt";
    //creare(nume_fisier);
    //raport(nume_fisier, nume_fisier_txt);
    modificare(nume_fisier);
}
#包括
类型定义结构{
char CNP[14];//CNP=个人识别号
char nume[30];//nume=name
int an;//an=year
int grupa;//grupa=group
int nrDisc;//nrDisc=类数
int note[20];//note=grades
}学生;
void creare(char*nume){//creare=创建
文件*f;
学生证;
fopen_s(&f,nume,“wb”);
如果(!f)
printf(“Eroare”);
否则{
printf(“CNP:”);
获取(s.CNP);
而(!feof(stdin)){
printf(“Nume:”);
获取(s.nume);
printf(“An:”);
scanf_s(“%d”和s.an);
printf(“Grupa:”);
scanf_s(“%d”和s.grupa);
printf(“专业编号:”);
scanf_s(“%d”和s.nrDisc);
对于(int i=0;i
您可以使用英文名称作为结构成员。可能作为注释。我可以提供一个想法,为什么你有两个GET(s.CNP);creare的else块中的语句。另外,如果我没记错的话,记录被正确地存储了,不是吗?我再次为结构成员编写了翻译:当您读取了最后一条记录时,eof标志还没有打开。只有在第一个失败的
获取
后,它才会处于活动状态,但您处理的是一条完全不存在的记录!请停止使用几十年来不安全和不推荐使用的
gets
!为什么要在修改二进制文件的函数中检查stdin的EOF?另外,我相信fseek(f,-sizeof(s),SEEK_CUR)比使用0,1,2更具可读性。若您想让按下EOF作为退出循环的唯一方式,那个么可以使用条件中断语句,比如If(=EOF)break;
while (fread(&s, sizeof(s), 1, f)) {
            int g=0;
            char nume[30]; //size of nume here should be same as that of structure

            if (grupa == s.grupa) {
                g = 1;
                printf("Numele initial este:%s\n", s.nume);
                printf("Noul nume este:");
                getchar();
                gets(nume);
                fseek(f,-sizeof(s), SEEK_CUR)) ; //Using macros helps clarify code
                fwrite(&s, sizeof(s), 1, f);
                break;  //break after modifying content

            }
            if (feof(f))
               break;