读取 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写一个数据然后读取一个数据是正确的,但是当写入多个数据时,读出数据就不正确,求指教?