使用fgetc读取文件后是否需要调用rewind重置文件指针?
解答
首先你给出的示例代码存在几处会影响逻辑正确性的问题:
- 存储
fgetc返回值的变量ch定义为char类型是错误的:fgetc返回值为int类型,EOF取值通常为-1,若编译环境下char为无符号类型,ch永远无法等于EOF,会触发死循环,正确写法为int ch;。 fopen打开失败的判断分支仅打印错误日志,没有中断后续执行,后续对空指针ptr调用fgetc会直接导致程序崩溃。do...while循环会先读取字符、打印字符再判断是否为EOF,会把EOF也当作有效字符传入printf,输出多余乱码。- 代码末尾已经调用
fclose(ptr)关闭文件指针,关闭后的指针属于失效野指针,对其执行任何读写、偏移操作都是未定义行为,会触发内存访问错误。
针对你问的「读完文件后是否需要调用rewind(fptr);才能回到文件起始位置读取」,分两种场景判断:
- 若已经执行了
fclose关闭文件:不需要也不能调用rewind,失效指针不存在偏移回开头的可能,必须重新调用fopen("test.txt", "r")获取新的有效文件指针,才能从文件起始位置读取内容。 - 若还未关闭文件,只是读完所有内容读到了EOF:必须重置文件位置指示器才能从头读取,此时调用
rewind(fptr)是正确方案。文件打开后会维护一个内部位置指示器,标记当前读写位置。当fgetc读到EOF时,位置指示器停在文件末尾,同时流的EOF标志位被置位,不做重置的话后续所有读操作都会直接返回EOF。
rewind的作用就是把位置指示器移动到文件开头,同时清除流的EOF标志和错误标志,执行完成后即可正常从头读取。也可以使用fseek(fptr, 0, SEEK_SET); clearerr(fptr);组合实现和rewind完全一致的效果。
额外注意:你示例代码里打开文件拿到的指针变量名是ptr,问题中提到的fptr需要和实际打开文件返回的指针对象对应,不要对未初始化、不属于目标文件的指针调用文件操作函数。
内容的提问来源于stack exchange,提问作者stht55
相关产品推荐
相关产品推荐

