FILE* file_;
char buffer[5];
file_ = fopen("Data.txt", "a+");
while (!feof(file_))
{
fread(buffer, sizeof(buffer), 1, file_);
cout << buffer<<" ";
BM(buffer, pat);
}
Data.txt =“ ABCC1ABCC2XXX”
输出:
ABCC1m
ABCC2m
XXX C2 m
如何在开始从以前的缓冲区生成字符之前使缓冲区停止?(字体部分)
想要的输出:
ABCC1
ABCC2
XXX
答案 0 :(得分:5)
您有两个问题。首先,您根本不会以buffer
结束以空值结束(这就是为什么要获得m
输出的原因。其次,当出现{简短阅读。
buffer
会告诉您已读取了多少个字符,您需要将fread
放在此处。 编辑先前的描述不正确。它告诉您已读取了多少个对象,每个对象的大小均为arg2,而您最多读取了arg3。您需要将参数更改为'\0'
,以便读取单个字符,并且读取的字符与缓冲区中的空间一样多。所以:
fread
请注意:如果缓冲区不是 FILE* file_;
char buffer[5+1];
file_ = fopen("Data.txt", "a+");
while (!feof(file_))
{
const size_t nchars = fread(buffer, 1, sizeof(buffer)-1, file_);
buffer[nchars] = '\0';
cout << buffer<<" ";
BM(buffer, pat);
}
/ fread
/ sizeof(buffer[0])
以外的东西,则char
的第二个参数也可以写成signed char
-但定义的这三个的大小为1。
答案 1 :(得分:4)
好的,我找不到合适的副本-也许有人会找到。
行
fread(buffer, sizeof(buffer), 1, file_);
可能会完全填满您的缓冲区。您需要保留返回值以知道实际写入了多少个字节,但是假设您的文件至少包含五个字节,buffer
数组的所有五个字节现在都已初始化。
但是,要将buffer
打印为常规C字符串,它需要第六个字节,其中包含空终止符。
例如,C字符串"12345"
实际上表示为char数组{'1', '2', '3', '4', '5', 0}
。
您的缓冲区中没有终结符的空间,也不要编写终结符,因此不能将其视为简单的C字符串。
您的选择是:
不添加终结符,而是跟踪大小-您可以使用C ++ 17
std::string_view bufstr(buffer, nchars);
将指针和大小保持在一起(可以正常打印)