我目前正在學習 C 和 OpenGL。現在我正在嘗試將完整的檔案讀入 C 樣式字串(準確地說,我正在嘗試讀取的檔案包含 GLSL 著色器的源代碼)。
假設以下代碼:
std::streamoff get_char_count(const char *path) {
auto file = std::ifstream(path);
file.seekg(0, std::ios::end);
return file.tellg();
}
char *read_all_text(const char *path) {
auto file_size = get_char_count(path);
auto file = std::ifstream(path);
auto buf = new char[file_size];
file.read(&buf[0], file_size);
return buf;
}
檔案內容:
#version 330 core
out vec4 color;
void main() {
color = vec4(0.35, 0.35, 1, 1);
}
呼叫read_all_text(),我希望收到與上述完全相同的檔案內容。但是,我得到了檔案內容,而且在大多數情況下,還有一些亂碼:
#version 330 core
out vec4 color;
void main() {
color = vec4(0.35, 0.35, 1, 1);
}
ar
我懷疑我不小心讀入了相鄰的記憶體。但是,查看 的來源get_char_count(),我希望得到檔案中正確的字符數 - 我確認檔案中的字符僅為 ASCII 字符。
我有什么明顯的遺漏嗎?
PS:我更喜歡使用char[]緩沖區方法,因為它似乎是最有效的選擇(而不是使用迭代器或rdbuf)。
uj5u.com熱心網友回復:
您必須對 C 字串進行空終止。檔案'\0'末尾沒有,所以它不是從欄位中讀取的,但一個 C 字串必須以 終止'\0':
auto buf = new char[file_size 1];
file.read(buf, file_size);
buf[file_size] = '\0';
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/505050.html
