我有一个名为"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);
我必须多次使用它,所以这就是每次打开和关闭文件的原因。
答案 0 :(得分:0)
如果你正在使用文本流(显然你是,因为你以模式"r"
而不是"rb"
打开文件),那么你可以传递给fseek
的唯一位置值是{0}或ftell
返回的某个值。换句话说,您无法计算自己阅读的字符数,并在调用fseek
时使用该计数。
如果您使用二进制流,那么您可以自己计算读取的字节数,但您必须处理这样一个事实,即操作系统用于表示换行符的任何内容都不会转换为换行符。因为无法知道给定的操作系统如何处理换行符,所以无法以二进制模式移植读取文本流。
简而言之,您应该认真对待C标准库中的要求。确保您在地图中存储的偏移量直接来自对ftell
的调用。 (“直接”表示您甚至无法使用ftell(file) + 1
;仅ftell(file)
。)
Unix / Linux程序员可以逃避不处理上述问题,因为Posix要求文本和二进制模式之间没有区别,并且只要求fseek
使用ftell
返回的值对于广泛的溪流。但是,如果您使用的是Windows,则会发现尝试使用fseek
返回到您自己计算的字节位置不起作用。如果您不使用Windows,您应该问问自己,您的程序是否有一天可能会被移植到Windows。