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

Troubles with fseek() and reading from file

我一段时间前开始学习 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() 应该 return 字符串 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.

我很绝望。任何 ideas/clues?

[编辑] 非常感谢所有帮助过我的人!

这里的问题是因为 fseek SEEK_CUR 参数。

您正在移动光标两次

一个 移动由 fgets 完成(它读取然后向前移动光标)。 second 移动由 fseek 手动完成。

一个解决方案可能是完全删除 fseek 调用。

另一种解决方案是使用 SEEK_SET 而不是 SEEK_CUR,但使用一个计数器来保存读取的字符总数(包括换行符)。要使此解决方案起作用,您还需要更改

fileCount=strlen(strFile);

fileCount += strlen(strFile) + 1;

SEEK_SET 将光标从文件开头移动。

SEEK_CUR 从当前位置移动光标。

你的问题是你没有正确使用fseek()

在您的代码中,

fseek(fp, fileCount, SEEK_CUR);

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

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