如果字符串未满,fwrite() 将之前的 printf() 语句写入打开的 .dat 文件中

问题描述 投票:0回答:1

我使用 fwrite() 将结构写入 .dat 文件。结构内容:

typedef struct record {
    char firstName[size], lastName[size];
    int age;
    double grade;
} record;

问题是,当我打开 .dat 文件时,我看到以前的 printf 语句,而其他垃圾文件就是该文件。当 2 个字符串的长度为 - 1 时,不会发生这种情况。在这种情况下,当我打开 .dat 文件时,文件内没有任何以前的 printf 语句,也没有其他垃圾,也没有新行。以下是 .dat 文件的 2 个实例,每种情况一个:

第一种情况:“输入您的选择:”是 main 中的 printf() 字符串参数,其他垃圾我猜更多是 printf 或其他东西

John                 ΐ[΄¨  
Enter your choice: 
  oφϊHV          ”›²Ιό   ›²Ιό  ¬›²Ιό  ®LΨ*John }<f    .γp+                                     oΕd*–Ι         oΕd*–Ι0ΰZ΄¨  θ²Ιό                ΝΜΜΜΜΜ@Bill                 ΐ[΄¨  
Enter your choice: 
  oφϊHV          ”›²Ιό   ›²Ιό  ¬›²Ιό  ®LΨ*Bill }<f    .γp+                                     oΕd*–Ι         oΕd*–Ι0ΰZ΄¨  θ²Ιό                      @

第二种情况:如果您检查文件中的输出,则不会像以前那样“输入您的选择:”,也没有其他垃圾或新行

MY NAME IS MY NAME IS MY NAME IS MY NAME JOHN JOHN JOHN JOHN E E EEEE EEEEE EE EEEEEEE EE  EEEEEEEE AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA N       ΝΜΜΜΜΜ@WHAT WHAT OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO  E E A PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP d             @

奇怪的事情(至少对我来说我知道的很少)是在这两种情况下使用 fread() 读取结构记录数据时通常会从文件中恢复。当我 printf() 结构记录的恢复元素时,我得到与输入相同的输出,如下所示(fread() 发生在单独的函数中):

第一个案例:

Record 1 data:
First Name = John
Last Name = John
Age = 23
Grade = 7.700000

Record 2 data:
First Name = Bill
Last Name = Bill
Age = 25
Grade = 7.000000

第二种情况:

Record 1 data:
First Name = MY NAME IS MY NAME IS MY NAME IS MY NAME JOHN JOHN JOHN JOHN E E EEEE EEEEE EE EEEEEEE EE  EEEEEEEE
Last Name = AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
Age = 78
Grade = 7.700000

Record 2 data:
First Name = WHAT WHAT OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO
Last Name =  E E A PPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPP
Age = 100
Grade = 7.000000

请注意,在这两种情况下,文件都以 rb+wb+ 模式打开。 有没有办法防止 printf() 字符串和其他垃圾在第一种情况下写入文件中?将结构体记录元素放入文件的代码:

// Called from main, file already open in rb+ or wb+ mode
void add(FILE *fp) {
    record r;
    char firstName[size], lastName[size];
    int age, lenFirst, lenLast;
    double grade;

    printf("\nEnter first name: ");
    fgets(firstName, size, stdin);

    lenFirst = strlen(firstName);
    if(firstName[lenFirst - 1] == '\n') {
        firstName[--lenFirst] = '\0';
    } else if(lenFirst + 1 == size) {
        while(getchar() != '\n');
    }

    printf("Enter last name: ");
    fgets(lastName, size, stdin);
    
    lenLast = strlen(lastName);
    if(lastName[lenLast - 1] == '\n') {
        lastName[--lenLast] = '\0';
    } else if(lenLast + 1 == size) {
        while(getchar() != '\n');
    }

    printf("Enter age: ");
    scanf("%d", &age);
    while(getchar() != '\n');

    printf("Enter grade: ");
    scanf("%lf", &grade);
    while(getchar() != '\n');

    

    strcpy(r.firstName, firstName);
    strcpy(r.lastName, lastName);
    r.age = age;
    r.grade = grade;

    fseek(fp, 0, SEEK_END);
    if(fwrite(&r, sizeof(record), 1, fp)) {
        printf("\nSuccesfully wrote to file!\n");
    } else {
        fprintf(stderr, "\nFailure at writing to file! Exiting...\n");
        exit(1);
    }
}
c file-io
1个回答
0
投票

感谢@001,解决方案相当简单。我没有将结构记录变量声明为

record r;
,而是放置了
record r = {0};
,现在文件内容没有垃圾和新行,如下所示:

John                                                                                                John                                                                                                       μQΈ…λ@Bill                                                                                                Bill                                                                                                       ΝΜΜΜΜΜ@

或者至少看起来是这样。

© www.soinside.com 2019 - 2024. All rights reserved.