【问题标题】:Read unknown symbols when read a content of file读取文件内容时读取未知符号
【发布时间】:2014-07-07 06:11:22
【问题描述】:

如标题所示,当读取文件内容时,我发现它会读取内容中的未知符号。

代码:

char *buff = NULL;
size_t size = 0;    
ifstream file("c:\\file.txt", ios::out);

if(!file){
    cout << "File does not open." << endl;
}

file.seekg(0, file.end);
size = file.tellg();
file.seekg(0, file.beg);

buff = new char[size];
while(!file.eof()){
    file.read(buff, size);
}

cout << buff << endl;
delete[] buff;

文件内容:

Hello world!. Thank you for help.

结果:

正如您在上图中看到的,有许多未知符号。
为什么会出现这些符号,我的代码有什么问题?

【问题讨论】:

  • 您应该为 buff 分配 size+1 并将最后一个字符设置为 '/0' - 这将解决问题。你不加载未知字符,你只是在缓冲区之后打印垃圾。
  • 您还应该自己对字符串进行空终止。 read 读取字节,而不是字符串。
  • 最好使用'vector buffer',避免'new'操作符分配内存。
  • 我不明白你为什么将ios::out 传递给输入流:ifstream file("c:\\file.txt", ios::out);。你可以简单地写std::ifstream file("c:\\file.txt");。保持简单!
  • 如果可能,请将至少一些符号的副本添加到您问题的代码块中。您正在阅读的文件使用什么编码?此外,您想考虑这个或其他类似的解决方案:stackoverflow.com/questions/1138863/read-unicode-files

标签: c++ file-io


【解决方案1】:

您的 char 数组不是以 null 结尾的,或者创建一个为一个额外的 null 字符留有空间的数组(并将其设置为 '\0'

buff = new char[size + 1];
buff[size] = '\0';
// Or simply
buff = new char[size + 1]{};

或者最好尽量避免使用原始指针,尤其是对于用作字符串的字符数组。

while(!file.eof()) 是一种反模式,除非在非常特殊的情况下,否则不要使用它。

std::ifstream file("file.txt");
std::string buff{ // Use regular brackets if not C++11
  std::istreambuf_iterator<char>(file),
  std::istreambuf_iterator<char>()
};

【讨论】:

  • Your char array is not null terminated, either create the array with space for one extra null character (and set it to '\0'),如果可能的话,我想要一个例子。
  • @LionKing 添加了一个示例。
  • 我已经做到了buff = new char[size + 1];,但符号仍然出现。我也在使用visual studio 2010,而这个{} 不起作用。
  • @LionKing 改用= {0};。此外,将文本文件的确切内容粘贴到您的问题中,以及 chcp 的输出
  • 仍然不接受= {0}chcp是什么意思。
【解决方案2】:

您只能将 operator&lt;&lt;(const char *) 用于 C 风格的字符串。您不能将它用于任意字节块。它怎么知道在哪里停下来?

【讨论】:

  • OP 不知道区别。
  • @Adam 这是尽可能避免在 C++ 中使用 C 风格字符串和相关概念(例如 char *)的一个很好的理由。
  • 我完全同意。问题是 C++ 的教材很糟糕。新手首先会接触到这种废话,而适当的 C++ 技术留待以后使用。
  • 应该发生的事情是std::copycout。但是,谁能有精力正确地向每一个努力理解抛给他们的东西的 C++ 新手解释这些细微差别呢?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-31
  • 2017-04-11
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-05
相关资源
最近更新 更多