C getline() 读取最后一行两次
C getline() read last line twice
只是想知道为什么我的函数 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
我该如何解决?
说 getline
returns -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);
}
您实际上跳过了第一行。
由于您是从 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:
您的代码正在读取第一行,检查它有多长,然后读取下一行而不打印第一行。这就是为什么你错过了第一行。
我们在最后得到额外的空白打印,因为您正在检查是否从 previous 行中读取了任何内容。然后您无需检查即可立即阅读和打印。
// 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 的 return 值存储在 line_size 中,然后 然后 检查它是否为 -1。不检查 getline returned -1 并将 true/false 结果存储到 line_size.
while((line_size = getline(&line, &line_buf_size, stdin)) > -1)
只是想知道为什么我的函数 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
我该如何解决?
说 getline
returns -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);
}
您实际上跳过了第一行。
由于您是从 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:
您的代码正在读取第一行,检查它有多长,然后读取下一行而不打印第一行。这就是为什么你错过了第一行。
我们在最后得到额外的空白打印,因为您正在检查是否从 previous 行中读取了任何内容。然后您无需检查即可立即阅读和打印。
// 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 的 return 值存储在 line_size 中,然后 然后 检查它是否为 -1。不检查 getline returned -1 并将 true/false 结果存储到 line_size.
while((line_size = getline(&line, &line_buf_size, stdin)) > -1)