我对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
),并在读取文件内容之后在那里添加' '
。