文件末尾的 C++ 垃圾

标签 c++

我有一个问题,我不知道如何解决。 问题是:

char * ary = new Char[];

ifstream fle;
fle.open(1.txt, ios_base::binary);
fle.seekg(fle.end);
long count = fle.tellg();
fle.seek(fle.beg);

问题来了: 文件 1.txt 包含:Hello world!。

当我执行时:

ary = new char(count);
fle.read(ary, count);

ary 是这样填充的:Hello world! @T#^@$@FF(垃圾)

文件没问题,里面什么都没有,只有上面的。

平台:Win 7、VS 2012

知道如何解决这个问题。 (已解决)

(问题 2) 现在我面临另一个问题,fle.read 有时会读取比我给定的大小更多的内容。例如,如果我像 fle.read(buffer, 1000) 这样传递,它在某些情况下会结束 (strlen(buffer) = 1500。我该如何解决这个问题?

问候,

最佳答案

C 中的 char[] 字符串通常以 null 结尾。它们比必要的长一个字节,最后一个字节设置为 0x00。这是必要的,因为 C 无法判断数组的长度。

当您从文件中读取二进制数据时,不会将终止空字符读入字符串。这意味着像 printf 这样对未知长度的字符数组进行操作的函数将输出数组和内存中恰好在它之后的任何数据,直到它遇到空字符。

解决方案:分配比数据长度长一个字节的 char[]-buffer,并手动将最后一个字节设置为 0

更好的解决方案: 不要使用 C 风格的字符数组。以面向对象的方式进行并使用类 std::string来表示字符串。

关于文件末尾的 C++ 垃圾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19247443/

相关文章:

c++ - 为什么 std::unique_ptr 构造函数接受外部指针?

c++ - 列表 vector 真的是 vector 吗?

c++ - 如何更改通过 C++ 上的 FFMPEG 库提取的帧的配色方案?

C++ 崩溃(编译器?)

c++ - 使用 g++ 编译 C++ 程序时体系结构 x86_64 的 undefined symbol

c++ - 使用成员变量作为谓词

c++ - 引用 vector::front 有效,但 vector::begin 无效

c++ - 在 Visual Studio 2013 中运行程序时出错

c++ - 使用字符数组写入姓名的首字母

c++ - USB2Serial 的 Linux IOCTL