从文件中读取给定位置的字符数 - C.

时间:2017-05-21 15:42:11

标签: c

我有一个名为"cache.txt"的文件,我有一些数据。我有一个unordered_map,cache,有一对int作为值,其中:该对中的第一个元素表示我想要读取的字符数,第二个元素表示我想要读取的位置。来自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);

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

1 个答案:

答案 0 :(得分:0)

如果你正在使用文本流(显然你是,因为你以模式"r"而不是"rb"打开文件),那么你可以传递给fseek的唯一位置值是{0}或ftell返回的某个值。换句话说,您无法计算自己阅读的字符数,并在调用fseek时使用该计数。

如果您使用二进制流,那么您可以自己计算读取的字节数,但您必须处理这样一个事实,即操作系统用于表示换行符的任何内容都不会转换为换行符。因为无法知道给定的操作系统如何处理换行符,所以无法以二进制模式移植读取文本流。

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

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