当阅读一个简单的文件时,我总是溢出并从文件中阅读字节,尽管在读取之前我已经确定了文件的字节大小。
以下是我的当前代码:
FILE* file;
int error_no = fopen_s(&file, filepath, "r");
if (error_no != 0 || file == 0) {
std::cout << "Error whilst reading file: " + error_no;
}
fseek(file, 0, SEEK_END);
size_t size = ftell(file);
char* fileAsString = (char*) malloc(size+1);
fseek(file, 0, SEEK_SET);
fread(fileAsString, 1, size, file);
fileAsString[size] = 0;
std::cout << "\n" << size << "\n";
std::cout << fileAsString;
fclose(file);
我希望打开文件,将流推到文件的末尾,并使用ftell查找文件中的字符数。
然后我创建了一个字符串缓冲区来复制文件的内容。
最后,我重置了文件流,并将其读入字符串缓冲区。我通过在缓冲区的末尾添加字符串结束字符来完成此操作。
可悲的是,这就是我得到的:
114
#version 330 core
layout(location = 0) out vec4 color;
void main()
{
color = vec4(1.0, 0.0, 0.0, 1.0);
}═══════
我检查了一下,这个文件包含107个字符,这就解释了114个长度和7个不应该出现的“=”字符。
实际文件内容为:
#version 330 core
layout(location = 0) out vec4 color;
void main()
{
color = vec4(1.0, 0.0, 0.0, 1.0);
}
希望这足够清楚!
1条答案
按热度按时间de90aj5v1#
当您以
"r"
模式读取文件时,您是在文本模式下进行阅读,并且您的双字节\r\n
行结束符将转换为内存中的\n
字符串。但是ftell
返回的是文件的长度(以字节为单位)(每个换行符计算两个字节)。但是,您是根据文件中的字节数(而不是字符串中的字符数)来标记字符串的结尾(通过设置空字符)。因为你已经把null终止符放在了字符串的末尾,所以在原始文件中,每一个换行符都有一个垃圾字符。相反,您可能希望保留原始文件的字节。要做到这一点,请尝试以
"rb"
模式打开文件,以二进制模式读取它,这应该可以防止它将文件中的\r\n
更改为内存中字符串中的\n
。