C - _IOLBF 自定义缓冲区不加载一行
C - _IOLBF custom buffer does not load a single line
我有一个包含 20 行和 30 列整数的文本文件。
通过 C 程序,我想创建一个自定义缓冲区并仅加载文件的第一行。
如果我使用 setvbuf 在 _IOLBF 中设置缓冲区模式,为什么我的缓冲区包含整个文件而不仅仅是第一行?
#include <stdio.h>
int main(void)
{
char buffer[1024];
FILE * fp;
int val;
fp = fopen("input.txt", "r");
setvbuf(fp, buffer, _IOLBF, 1024);
fscanf(fp, "%d", &val);
printf("Contenuto del buffer: ");
for (int i = 0; i < 1024; i++)
printf("%c\n", buffer[i]);
return 0;
}
跟这个有关系吗?
According to this Microsoft documentation:
_IOLBF: For some systems, this provides line buffering. However, for Win32, the behavior is the same as _IOFBF - Full Buffering.
Setting C program to line buffer won't work
看来您混淆了 setvbuf
正在做的事情。通常,它仅以您尝试在 output 流上使用它的方式使用。将输入流设置为行缓冲对从中读取的内容没有任何影响,例如它不会强制读取在行尾停止。这就是 line-oriented 输入函数,例如 fgets
或 POSIX getline
的用处。
如果要读取第一行整数,请将循环限制为读取 30
整数,或者如果要将行作为文本读入缓冲区,则调用 fgets (buffer, sizeof buffer, fp);
和缓冲区将包含文件的第一行。
我有一个包含 20 行和 30 列整数的文本文件。 通过 C 程序,我想创建一个自定义缓冲区并仅加载文件的第一行。
如果我使用 setvbuf 在 _IOLBF 中设置缓冲区模式,为什么我的缓冲区包含整个文件而不仅仅是第一行?
#include <stdio.h>
int main(void)
{
char buffer[1024];
FILE * fp;
int val;
fp = fopen("input.txt", "r");
setvbuf(fp, buffer, _IOLBF, 1024);
fscanf(fp, "%d", &val);
printf("Contenuto del buffer: ");
for (int i = 0; i < 1024; i++)
printf("%c\n", buffer[i]);
return 0;
}
跟这个有关系吗?
According to this Microsoft documentation:
_IOLBF: For some systems, this provides line buffering. However, for Win32, the behavior is the same as _IOFBF - Full Buffering.
Setting C program to line buffer won't work
看来您混淆了 setvbuf
正在做的事情。通常,它仅以您尝试在 output 流上使用它的方式使用。将输入流设置为行缓冲对从中读取的内容没有任何影响,例如它不会强制读取在行尾停止。这就是 line-oriented 输入函数,例如 fgets
或 POSIX getline
的用处。
如果要读取第一行整数,请将循环限制为读取 30
整数,或者如果要将行作为文本读入缓冲区,则调用 fgets (buffer, sizeof buffer, fp);
和缓冲区将包含文件的第一行。