我试图编写一个从文件中读取数据的特定程序,但我意识到当我用fgetc读取文件时,如果稍后使用fget,它就没有任何输出。
例如,这段代码:
#include <stdio.h>
#include <stdlib.h>
int main() {
FILE * arq = fopen("arquivo.txt", "r");
char enter = fgetc(arq);
int line_count = 1;
while(enter != EOF) {
if (enter == '\n') line_count++;
enter = fgetc(arq);
}
printf("%d", line_count);
char str[128];
while(fgets(str, 128, arq)) printf("%s", str);
}第二个while不打印任何内容,但是如果我删除第一个while,代码将打印文件内容。为什么会发生这种事?
发布于 2021-11-18 02:13:23
rewind(arq);是你想要的
当您从文件中读取时,内部文件指针将随着您的读取而前进,因此每个后续读取都将返回该文件中的下一个数据。当您到达末尾时,所有后续读取都将返回EOF,因为没有更多可读取的内容。
可以使用fseek和ftell函数操作内部文件指针。fseek允许您将内部文件指针设置为文件中相对于开始、结束或当前位置的任意点。ftell会告诉你当前的位置。这使您可以轻松地记住文件中的任何位置,然后再返回。
概要
#包括 int rewind(文件*流,长偏移距,整数);长ftell(文件*流);
描述
函数设置流所指向的流的文件位置指示符。新的位置(以字节为单位)是通过向其中指定的位置添加偏移字节来获得的。如果将其设置为SEEK_SET、SEEK_CUR或SEEK_END,则偏移量相对于文件的开始、当前位置指示符或文件末尾。成功地调用file()函数可以清除流的文件末尾指示符,并取消ungetc(3)函数对同一流的任何影响。
函数获取由流指向的流的文件位置指示符的当前值。
函数将按流指向的流的文件位置指示符设置为文件的开头。它相当于:
(空)搜寻(流,0L,SEEK_SET)
除非流的错误指示符也被清除(请参见清除器(3))。
这里需要注意的一点是,ftell使用的偏移量和byte返回的偏移量是字节偏移量,而不是字符偏移量。因此,当访问非二进制文件(任何未用"b"修饰符打开的文件)时,偏移量可能与字符不完全对应。将ftell返回的偏移量传递到文件中的同一个位置应该是可以的,但是尝试计算偏移量可能会很棘手。
https://stackoverflow.com/questions/70013676
复制相似问题