C getline()读取最后一行两次



不知道为什么我的函数getline()读取最后一行两次。

我应该从tsv文件中读取并将每行打印到标准输出。但是不知怎么的,一直读取最后一行两次。

char *line = NULL;
size_t line_buf_size = 0;
ssize_t line_size;
line_size = getline(&line, &line_buf_size, stdin);
int row = 0;

while (line_size >= 0)
{
row++;
line_size = getline(&line, &line_buf_size, stdin);
printf("%s", line);

如果文件看起来像这样

A B C
D E F

它打印

A B C
D E F
D E F

我如何修复它?

你实际上跳过了第一行。

由于您是从STDIN中读取的,因此您键入的内容没有文件。你的输出和输入混淆了。我们可以通过更改printf来添加前缀printf("output: %s", line);来看到这一点。

A B C   <-- this is your input echoed to the screen
D E F   <-- and this
output: D E F
output: 

你的代码正在读取第一行,检查它有多长,然后读取下一行,而不打印第一行。这就是为什么你错过了第一行。

我们在最后得到额外的空白打印,因为您正在检查是否从前面的行读取了任何内容。这样你就不用检查就可以直接阅读和打印了。

// Read the first line.
line_size = getline(&line, &line_buf_size, stdin);
int row = 0;
// Check if you read anything from the *previous* line.
while (line_size >= 0)
{
row++;
// Read the next line overwriting the first line.
line_size = getline(&line, &line_buf_size, stdin);
// Print the second and subsequent lines without first checking
// if you read anything.
printf("%s", line);
}

相反,读取、检查和打印。

#include <stdio.h>
int main() {
char *line = NULL;
size_t line_buf_size = 0;
int row = 0;
// Read and check.
while (getline(&line, &line_buf_size, stdin) > -1)
{
row++;
// Print.
printf("output: %s", line);
}
}

我们得到交错的输入和输出。

A B C
output: A B C
D E F
output: D E F

你不需要存储行长度,但是如果你在比较它之前给赋值加上了双亲。这保证了做(line_size = getline(...)) > -1而不是line_size = (getline(...) > -1)。这就是将getline的返回值存储在line_size和中,然后检查是否为-1。不检查getline是否返回-1,并将true/false结果存储在line_size中。

while((line_size = getline(&line, &line_buf_size, stdin)) > -1)

假设getline返回-1表示EOF。接下来你要做什么?你打印。哦!

char *line = NULL;
size_t line_buf_size = 0;
int row = 0;
while ( getline(&line, &line_buf_size, stdin) >= 0 ) {
++row;
printf("%s", line);
}
if (ferror(stdin)) {
perror("getline");
exit(1);
}

相关内容

  • 没有找到相关文章

最新更新