gpt4 book ai didi

c - 从 C 文件中读取特定行

转载 作者:太空宇宙 更新时间:2023-11-04 01:30:39 25 4
gpt4 key购买 nike

好的,所以在阅读完两者之后:How to read a specific line in a text file in C (integers)What is the easiest way to count the newlines in an ASCII file?我认为我可以使用两者中提到的要点来高效快速地读取文件中的一行

这是我的代码:

char buf[BUFSIZ];
intmax_t lines = 2; // when set to zero, reads two extra lines.
FILE *fp = fopen(filename, "r");
while ((fscanf(fp, "%*[^\n]"), fscanf(fp, "%*c")) != EOF)
{

/* globals.lines_to_feed__queue is the line that we _do_ want to print,
that is we want to ignore all lines up to that point:
feeding them into "nothingness" */

if (lines == globals.lines_to_feed__queue)
{
fgets(buf, sizeof buf, fp);
}
++lines;
}
fprintf(stdout, "%s", buf);
fclose(fp);

现在上面的代码运行得非常好,我非常很高兴自己发现你可以fscanf一个文件直到某个点,然后使用fgets 将所述点处的任何数据读入缓冲区,而不是必须 fgets 每一行然后 fprintf buf,当所有我关心的是我正在打印的行:我不想将我不太关心的字符串存储在一个缓冲区中,我只打算对一行使用一次 .

但是,我遇到的唯一问题,如 //当设置为零时,读取额外的两行 注释:当 lines 初始化为0 的值,而我想要的行类似于 200,我将获得的行实际上是行 202。有人可以解释一下我在这里做错了什么/为什么会发生这种情况,以及我的快速修复 lines = 2; 是否正常或者是否不够(如,这里真的出了什么问题吗,它只是碰巧起作用了?)

最佳答案

为什么必须将 lines 设置为 2 有两个原因,这两个原因都可以从您想要第一行的特殊情况中得出。

一方面,在 while 循环中,您要做的第一件事是使用 fscanf 消耗一行,然后检查 counter 匹配你想要的行。问题是,如果你想要的是你刚刚消费的那条线,那你就不走运了。另一方面,您基本上是通过查找下一个 \n 并递增 lines 来移动行 after 您检查当前行是否是该行你在追求。

这两个因素共同导致了 lines 计数的偏移,因此以下是将它们考虑在内的同一函数的一个版本。此外,它还包含一个 break; 语句,一旦您到达要查找的行,以便 while 循环停止进一步查找文件。

void read_and_print_line(char * filename, int line) {
char buf[BUFFERSIZE];
int lines = 0;
FILE *fp = fopen(filename, "r");
do
{
if (++lines == line) {
fgets(buf, sizeof buf, fp);
break;
}

}while((fscanf(fp, "%*[^\n]"), fscanf(fp, "%*c")) != EOF);
if(lines == line)
printf("%s", buf);
fclose(fp);
}

关于c - 从 C 文件中读取特定行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23038909/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com