用fseek()和从文件中读取麻烦

时间:2015-04-27 15:10:05

标签: c fgets fseek

我不久前开始学习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.

我很绝望。有什么想法/线索吗?

[编辑] 非常感谢帮助我的每个人!

2 个答案:

答案 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()语句。