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() 语句即可。
我一段时间前开始学习 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() 语句即可。