fseek()和从文件读取的问题

6

我前段时间开始学习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(),但它就是不会移动。 我的文件中包含以下单词:First,Last,Index,Field,ID,Number,Fire,Film。(每个单词都在新行中)。 当我运行程序并输入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.

我很绝望。有什么想法/线索吗?
[编辑] 非常感谢所有帮助我的人!

3
你想增加fileCount吗?如果你在使用Windows,你可能需要用"rb"打开文件,因为它使用CRLF约定。如果你按顺序读取文件,为什么还要使用fseek呢? - Mike Dunlavey
1
你的文件指针已经在下一个单词处,fgets 在读取时移动文件指针,因此 fseek 是多余的。 - phil
1
顺便提一下,在文本模式下打开的文件中,fseek 可能是危险的;在这里解释了原因。简而言之:由于 \n <-> \r\n 转换,fseek 的参数应该是 0 或来自早期的 ftell 调用。因此,在程序中应该同时使用 fseekftell(或者都不用?也许你根本不需要 fseek?)。 - anatolyg
在发布的代码中,完全没有必要调用fseek,因为该调用将步进文件指针(在调用fgets后,文件指针已经向前移动了fgets读取的字符数)。 - user3629249
然而,更好的方法是逐个单词阅读,然后进行比较。这样,就不会错过任何一个单词,也不需要使用fseek。 - user3629249
显示剩余3条评论
2个回答

3
问题出现在fseek的参数SEEK_CUR上。
你将光标移动两次
一次移动是由fgets完成的(它读取然后向前移动光标)。 第二次移动是通过手动调用fseek完成的。
解决方案可以是完全删除fseek调用。
另一个解决方案是使用SEEK_SET而不是SEEK_CUR,但要使用一个计数器来保存读取的总字符数(包括换行符)。为了使此解决方案正常工作,您还需要更改
fileCount = strlen(strFile);

fileCount += strlen(strFile) + 1;
SEEK_SET将光标从文件开头移动。 SEEK_CUR从当前位置移动光标。

1
非常感谢!我没有找到任何fgets移动光标的地方,否则我就不会放置那个fseek()了。 我将fseek()放在for循环外面,现在它可以工作了! - Milan Todorovic

2

您的问题在于没有正确使用fseek()

在您的代码中,

fseek(fp, fileCount, SEEK_CUR);

将指针设置为当前位置加上文件计数(偏移量)。这就是为什么它跳过了Last并将Index读为字符串2的原因。

要解决此问题,只需删除fseek()语句即可。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接