我有一个名为"cache.txt"的文件,其中有一些数据。我有一个unordered_map,cache,带有一对整数作为值,其中:该对中的第一个元素代表我要读取的字符数,第二个元素代表我要读取的位置。来自unordered_map的键comps不相关。

....
fp = fopen("cache.txt", "r");
fseek(fp, cache[comps].second, SEEK_SET);
int number_of_chars = cache[comps].first;
char c;
while((c = getc(fp)) != EOF && number_of_chars > 0) {
   --number_of_chars;
   printf("%c",c);
}
fclose(fp);


我必须多次使用它,所以这就是每次打开和关闭文件的原因。

最佳答案

如果您正在使用文本流(显然是这样,因为您以"r"模式而不是"rb"模式打开文件),则可以传递给fseek的唯一位置值为0或。换句话说,您不能计数自己读的字符并在调用ftell时使用该计数。

如果使用二进制流,则可以自己计算字节数,但是您将不得不面对这样一个事实,即操作系统用来表示换行符的任何内容都不会转换为换行符。由于无法知道给定的操作系统如何处理换行符,因此无法以二进制方式可移植地读取文本流。

简而言之,您应该认真对待C标准库中的要求。确保您存储在地图中的偏移量直接来自对fseek的调用。 (“直接”表示您甚至不能使用ftell;只能使用ftell(file) + 1。)

Unix / Linux程序员可以不理会上面的问题,因为Posix要求文本模式和二进制模式之间没有区别,并且只要求ftell(file)对于宽泛的流使用fseek返回的值。但是,如果您使用Windows,则会发现尝试使用ftell返回您自己计算的字节位置是行不通的。而且,如果您不使用Windows,则应问自己是否有一天有可能将程序移植到Windows。

10-08 10:50