在c++中读取文件,在实际文件内容之后给出奇怪的字符

  • 本文关键字:文件 字符 之后 c++ 读取 c++
  • 更新时间 :
  • 英文 :


我对c++相当陌生,我正试图将JSON文件读取为char数组/char *。但每次读取文件时,它都会在文件内容后面显示一些奇怪的字符,比如

{"Image"myImg.jpg" ts; C: 保证ßr

为什么会发生这种情况?我怎么修理它?

这是我当前的代码:

char* read_file(const char *file)
{
std::ifstream infile;
infile.open(file, std::ios_base::in | std::ios_base::binary);
if (infile)
{
infile.seekg(0, std::ifstream::end);
int len = infile.tellg();
infile.seekg(0, std::ifstream::beg);
char *data = new char[len];
infile.read(data, len);
return data;
}
return nullptr;
}

所谓的" c - style ";字符串需要以空结束,以便与任何标准函数一起工作,例如用于显示它们的函数。

为了使您的data缓冲区符合这一点,您需要增加分配的缓冲区大小以允许此终止符字符,并且还要确保最后一个元素实际上是nul字符(零或'')。

char* read_file(const char *file)
{
std::ifstream infile;
infile.open(file, std::ios_base::in | std::ios_base::binary);
if (infile)
{
infile.seekg(0, std::ifstream::end);
int len = infile.tellg();
infile.seekg(0, std::ifstream::beg);
char *data = new char[len + 1]; // Add space for the nul terminator ...
infile.read(data, len);
data[len] = '';               // ... and set the last element to "nul"
return data;
}
return nullptr;
}

如果没有适当的终止符,像cout << data这样显示字符数组的调用将继续输出字符,直到它(偶然地)在给定的缓冲区中找到一个零字节(或者,它可能会在这样做之前崩溃)。你看到的"奇怪"字符代表碰巧在内存中的数据,就在你分配的data缓冲区之后。

char *data = new char[len];
infile.read(data, len);

将文件中的所有内容读入char缓冲区。仅此而已。什么都没有。

如果您试图使用任何期望看到C风格字符串的方法打印char缓冲区的内容,那么您将忘记一个小细节:C风格字符串以''结束,这段代码忽略了将其添加到读取内容中,因此无论您使用哪个C或c++库函数来执行此操作,都将简单地查找''字符。继续找。继续寻找。继续找。

您只需要在前面new添加一个额外的字节(len+1而不是len),并在读取文件内容之后在那里添加''

最新更新