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

从文件中读取给定位置的字符数-C,c,C,我有一个名为“cache.txt”的文件,其中有一些数据。我有一个无序的映射,cache,其中一对int作为值,其中:第一个元素表示我要读取的字符数,第二个元素表示我要读取的位置。无序映射中的键,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

我有一个名为
“cache.txt”
的文件,其中有一些数据。我有一个无序的映射,
cache
,其中一对int作为值,其中:第一个元素表示我要读取的字符数,第二个元素表示我要读取的位置。无序映射中的键,
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
返回的某个值。换句话说,您不能对自己读取的字符进行计数,并在调用
fseek
时使用该计数

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

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


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

您不必每次都打开/关闭。只要在打开的手柄上反复执行
fseek
。这看起来更像是一个陈述而不是一个问题。很酷的故事。但是你想问什么?请补充一个具体的问题。我正在使用该文件进行写作和阅读,我认为这是一个简单的任务。它无法正确获取信息,是否缺少任何内容?这个过程可以吗?