我不久前开始学习C(通过Youtube和K& R),我正在尝试编写一些程序作为练习。 目前,我想创建一个程序,从文件中读取单词,并将其开头与用户的输入进行比较。 该程序成功地比较了第一个单词并给了我一个结果,但我不能让 fseek()正确地移动到下一行! (这是寻求单词的部分的当前版本。)
fp= fopen("final.txt", "r");
for (i=0; i<8; i++){
fseek(fp, fileCount, SEEK_CUR);
fgets(strFile, 20, fp);
fileCount= strlen(strFile);
printf("Strlen %d. is: %d\n", i+1, fileCount);
printf("String is %s", strFile);
compareStr(strUser, strFile);
};
fclose(fp);
fileCount 设置为0, strlen()应该返回字符串srtFile的长度,但它并不是很好。我甚至尝试手动设置fseek(),但它不会移动。 我的文件中的文字是:第一,最后,索引,字段,ID,数字,火,电影。 (每个都在新的一行)。 当我运行程序并输入F(搜索具有大写字母f的单词)时,输出为:
Type in the letters: F
Strlen 1. is: 6
String is First
Match found: First
Strlen 2. is: 6
String is Index
Strlen 3. is: 1
String is
Strlen 4. is: 2
String is D
Strlen 5. is: 5
String is mber
Strlen 6. is: 1
String is
Strlen 7. is: 3
String is ilmStrlen 8. is: 3
String is ilm
Process returned 0 (0x0) execution time : 2.218 s
Press any key to continue.
我很绝望。有什么想法/线索吗?
[编辑] 非常感谢帮助我的每个人!
答案 0 :(得分:3)
此处出现的问题是因为fseek SEEK_CUR参数。
您正在移动光标两次。
一次移动由fgets完成(它读取然后向前移动光标)。 第二次移动由fseek手动完成。
解决方案可能是完全删除fseek调用。
另一种解决方案是使用SEEK_SET而不是SEEK_CUR,但使用一个计数器来保存字符读取的总数(包括换行符)。要使此解决方案起作用,您还需要更改
fileCount = strlen(strFile);
到
fileCount + = strlen(strFile)+ 1;
SEEK_SET将光标从文件的开头移开。
SEEK_CUR将光标从当前位置移开。
答案 1 :(得分:2)
您的问题是您没有正确使用fseek()
。
在您的代码中,
fseek(fp, fileCount, SEEK_CUR);
将指针设置为的当前位置加上filecount(偏移量)。这就是为什么它跳过Last
并将Index
读为字符串2。
要解决此问题,只需删除 fseek()语句。