C++ istream::read
C++ istream::read
为什么这个函数读取文件错误?在读取最后一个符号后的 buff 中包含垃圾值。它与内存对齐有关吗?我知道更安全的 std::string 和 rdbuff(),但我想了解 C 风格字符串的工作原理。
char * read_from_file(const char * path)
{
std::ifstream fin(path);
if (fin)
{
fin.seekg(0, fin.end);
size_t length = fin.tellg();
fin.seekg(0, fin.beg);
char * buff = new char[length];
fin.read(buff, length);
std::cout << buff << "\n";
fin.close();
return buff;
}
return nullptr;
}
例如:
文件:
#version 330 core
out vec4 FragColor;
void main()
{
FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
}
增益:
#version 330 core
out vec4 FragColor;
void main()
{
FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
}
isample_blit_scaled <-- garbage
您需要为字符串添加空终止符。
char * read_from_file(const char * path)
{
std::ifstream fin(path, std::ios::binary);
if (fin)
{
fin.seekg(0, fin.end);
size_t length = fin.tellg();
fin.seekg(0, fin.beg);
char * buff = new char[length+1]; // allow room for terminator
fin.read(buff, length);
buff[length] = '[=10=]'; // add terminator
std::cout << buff << "\n";
fin.close();
return buff;
}
return nullptr;
}
为什么这个函数读取文件错误?在读取最后一个符号后的 buff 中包含垃圾值。它与内存对齐有关吗?我知道更安全的 std::string 和 rdbuff(),但我想了解 C 风格字符串的工作原理。
char * read_from_file(const char * path)
{
std::ifstream fin(path);
if (fin)
{
fin.seekg(0, fin.end);
size_t length = fin.tellg();
fin.seekg(0, fin.beg);
char * buff = new char[length];
fin.read(buff, length);
std::cout << buff << "\n";
fin.close();
return buff;
}
return nullptr;
}
例如:
文件:
#version 330 core
out vec4 FragColor;
void main()
{
FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
}
增益:
#version 330 core
out vec4 FragColor;
void main()
{
FragColor = vec4(1.0f, 0.5f, 0.2f, 1.0f);
}
isample_blit_scaled <-- garbage
您需要为字符串添加空终止符。
char * read_from_file(const char * path)
{
std::ifstream fin(path, std::ios::binary);
if (fin)
{
fin.seekg(0, fin.end);
size_t length = fin.tellg();
fin.seekg(0, fin.beg);
char * buff = new char[length+1]; // allow room for terminator
fin.read(buff, length);
buff[length] = '[=10=]'; // add terminator
std::cout << buff << "\n";
fin.close();
return buff;
}
return nullptr;
}