所以,我正在尝试找到一种方法来fgets()C中文本文件中的特定行,以将该行的内容复制到更永久的缓冲区中:
基本上,我想知道是否有办法在没有类似下面代码的情况下做到这一点:
FILE *fp;
fp = fopen(filename, "r");
char line[256];
char * buffer;
int targetline = 10;
while( targetline > 0)
{
fgets(line, 256, fp)
}
buffer =(char*)malloc(sizeof(char) * strlen(line));
strcpy(buffer, line);
所以基本上我不想遍历文件n-1次只是为了到达第n行...它只是看起来效率不高(而且,这是作业,我需要得到100 %哈哈)。
任何帮助都将不胜感激。
答案 0 :(得分:8)
如果你知道每一行的长度,你可以使用fseek跳到你想要的行。
否则,你需要经历所有行。
答案 1 :(得分:7)
除非您了解有关该文件的更多信息,否则无法随机访问特定行。新行由行末字符的存在分隔,并且它们通常可以在任何地方出现。文本文件没有 map 或 index ,可以跳到n th 行。
如果您知道,例如,文件中的每一行都是相同的长度,那么您可以使用随机访问来跳转到特定的行。如果没有这方面的额外知识,你就别无选择,只能遍历整个文件,直到达到你想要的一行。
答案 2 :(得分:5)
首先,你的行
buffer =(char*)malloc(sizeof(char) * strlen(line));
最好写成:
buffer = malloc(strlen(line) + 1);
需要+ 1
为终止“\0
”字符提供空间; strlen()
没有考虑到这一点。不需要在C中转换malloc()
的结果,并且在某些情况下可以掩盖错误。根据定义,sizeof(char)
为1,因此不需要。
你永远不会改变targetline
的值,所以你的循环永远不会终止。
但是在回答你的问题时,如果你有一个文本文件,并且想要读取它的第N行,你必须阅读并跳过前面的第一行N-1行。 (可以设置一个单独的索引,但是创建索引需要通过文件读取,并且在文件更改时保持索引最新是一个难题,可能超出了您现在正在做的事情。并且它并不是特别必要;从文件中读取10行的时间不会很明显。)
答案 3 :(得分:3)
我担心,没有其他方法可以在文件中获得第n行。你必须经历。文件中没有随机访问。
答案 4 :(得分:2)
如果要从文本文件中获取第n行,则必须先读取n-1行。这是顺序文件的本质。除非你知道你的所有行都是相同的长度,否则无法可靠地定位到特定行的开头。