读取 C 中的文件时输入正确但输出不正确

Posted

技术标签:

【中文标题】读取 C 中的文件时输入正确但输出不正确【英文标题】:Right inputs but incorrect output when reading though a file in C 【发布时间】:2021-09-01 00:06:19 【问题描述】:

我有一个结构,它应该包含一个单词、对应的数字和线索。

struct Word
    char word[30];
    int level;
    char clue[500];
;
typedef struct Word Word;

我通过以下函数对其进行操作。

void createWord() //creates a word

    FILE *fp;
    fp = fopen("words.bin", "a+"); 

    if(!fp)
        printf("File could not be opened.\n");
    else

        Word w;

        w.level = getLevel(); //gets level number in the list

        getchar();
        printf("Enter word: ");
        scanf("%[^\n]s", w.word); //asks for the word

        getchar();
        printf("Enter clue: ");
        scanf("%[^\n]s", w.clue); //asks for the clue
        getchar();
        
        //i used this to trace the values
        printf("\n%d", w.level);
        printf("\n%s", w.word);
        printf("\n%s", w.clue);
        
        //goes through the file and writes the content in it
        fseek(fp, sizeof(Word)*(w.level - 1), SEEK_SET);
        fwrite(&w, sizeof(Word),1, fp);

        fclose(fp);
    

int getLevel()

    FILE *fp;
    fp = fopen("words.bin", "r");

    fseek(fp,0,SEEK_END);
    int n = ftell(fp)/sizeof(Word); //tells me the number of 'Words' that are already in the file
    fclose(fp);

    return n++;

void displayContent() //displays all the content inside the file

    FILE *fp;
    fp = fopen("words.bin", "rb");

    if(!fp)
        printf("File could not be opened.\n");
    else
        Word w;
        while(fread(&w, sizeof(Word), 1, fp) && !feof(fp))
            printf("\n");
            printWord(&w);
        

        fclose(fp);
    


void printWord(struct Word *w)

    printf("Level: %d\n", w->level+1);
    printf("Word: %s\n", w->word);
    printf("Clue: %s\n", w->clue);

这是一个可重现的最小示例:

int main()

    int choice;

    Word w;
    do

        printf("\n\n1. Create Word\n");
        printf("2. Diplay all words\n");
        printf("3. Exit\n");
        printf("\n? ");
        scanf("%d", &choice);

        switch(choice)
            case 1:
                createWord();
                break;

            case 2:
                displayContent();
                break;

            default:
                break;
        
    while(choice != 3);

    return 0;

我的主要问题是我输入了正确的值。每当我在使用该功能之前检查它时,它都会正确读取。但是,当我尝试显示文件中的所有内容时,输出完全不稳定。这是一个例子。

Level: 1 //this one is correct
Word: Uno
Clue: The grade our teacher will give us by the end of the semester.


Level: 257 //this one is not, this is supposed to be 2
Word: vBo Burnham // this is supposed to be Bo Burnham only
Clue: //and this is supposed to print a sentence like 'Go listen to his new album'

我认为这与getchar() 有关,但我也不确定。任何形式的帮助都将不胜感激!

【问题讨论】:

return n++ 看起来不对。这将返回n 增加它之前的值。我猜你真的想要return (n+1) 第一次调用getLevel 时会返回0,然后createWord 中的fseek 将转到-sizeof(Word)。考虑在getLevel 中将return n++; 更改为return n + 1; 花时间研究scanf 的工作原理是值得的。 "%[^\n]s" 是一个常见错误,混合了两个不同的格式说明符 %[]%s。还有它如何处理空格(并非所有格式都相同),因为您已经在代码中添加了getchar(),这通常是不必要的。此外,在printf 中,换行输出通常放在最后,而不是最前面。 请注意在"a+"模式下打开文件时的行为:使用“a”访问类型或“a+”访问类型打开文件时,所有写操作都发生在文件末尾。可以使用 fseek 或 rewind 重新定位文件指针,但总是在执行任何写操作之前移回文件末尾。因此,无法覆盖现有数据。 因此,fwrite() 之前的 fseek() 不会执行任何操作。 【参考方案1】:
void createWord()

    FILE *fp;
    fp = fopen("words.bin", "a+");

    if(!fp)
        printf("File could not be opened.\n");
    else

        Word w;
        char tempWord[30];
        char tempClue[100];
        int tempNum;

        tempNum = getLevel();

        fgetc(stdin);

        printf("Enter word: ");
        fgets(tempWord, 30, stdin);
        tempWord[strlen(tempWord)-1] = 0;

        printf("Enter clue: ");
        fgets(tempClue, 100, stdin);
        tempClue[strlen(tempClue) - 1] = 0;

        w.level = tempNum;
        strcpy(w.word, tempWord);
        strcpy(w.clue, tempClue);

        printf("\n%d", w.level);
        printf("\n%s", w.word);
        printf("\n%s", w.clue);

        fwrite(&w, sizeof(Word), 1, fp);

        fclose(fp);
    

\n 让它变得很奇怪。它现在仍然有点,但它有效。

【讨论】:

以上是关于读取 C 中的文件时输入正确但输出不正确的主要内容,如果未能解决你的问题,请参考以下文章

AT24C02写一个数据然后读取一个数据是正确的,但是当写入多个数据时,读出数据就不正确,求指教?

java程序运行,用输入输出流读取c盘中的一个文件读取不到提示FileNotFoundException

如何在输入输出中正确使用通配符

C - 文件的读取()错误,存储在数组中并正确打印输出

C中的进程间通信

试图从数据库表中读取,但输出不正确