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

标签 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

XXXC2

如何让缓冲区在开始从之前的缓冲区生成字符之前停止?(粗体部分)

想要的输出:

ABCC1

ABCC2

XXX

最佳答案

你有两个问题。首先你不是空终止 buffer根本没有,(这就是为什么你得到 m 输出。其次,当有一个简短的阅读时,你没有在正确的地方以 null 终止 buffer

fread会告诉你它读了多少个字符,你需要把'\0'那里。 编辑 之前的描述不准确。它会告诉您它已读取了多少个对象,每个对象的大小为 arg2,而您最多读取了 arg3 个。您需要将参数更改为 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/unsigned char - 但是这三个定义的大小为 1。

关于c++ - 缓冲区用不需要的数据填充 char 数组中的最后一个空白区域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56339097/

相关文章:

c++ - 设置对第二个变量的引用

c++ - 如何设置QTreeView的起点目录?

c++ - 对无序集执行 set_difference

C++ 多变参数模板未绑定(bind)到函数参数

c++ - 在命名空间声明之后声明 using 语句

c++ - 我应该缓存它吗?

c++ - C99 中的 _Complex 类型的行为与 C++ 中的 std::complex<> 类似吗?

c++ - 指针和指向引用的指针

C++ 不能在 cout 中使用 vector 和字符串文字

c++ - STL 对输入与 STL 映射