缓冲区用不需要的数据填充char数组中的最后一个空白空间

时间:2019-05-28 09:31:53

标签: c++

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

2 个答案:

答案 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字符串。

您的选择是:

  1. 手动添加终止符,如Martin Bonner的回答
  2. 不添加终结符,而是跟踪大小-您可以使用C ++ 17

    std::string_view bufstr(buffer, nchars);
    

    将指针和大小保持在一起(可以正常打印)

  3. 完全停止使用旧的C I / O库。当然,C ++ I / O库没有更好的方法来读取五个字符的组,但是例如,读取整行代码更容易正确完成。