读取文件时溢出

问题描述 投票:0回答:1

当读取一个简单文件时,尽管我确保在读取之前获得文件的大小(以字节为单位),但我仍然会溢出并从文件中读取字节。

这是我当前的代码:

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);
}

希望这足够清楚!

c++ file buffer-overflow
1个回答
0
投票

当您使用

"r"
模式读取文件时,您正在以文本模式读取,并且两字节
\r\n
行结尾将被转换为内存中的
\n
字符串。但是
ftell
返回文件的长度(以字节为单位)(每个换行符计算两个字节)。但是,您根据文件中的字节数(而不是字符串中的字符数)来标记字符串的结尾(通过设置空字符)。由于您已将空终止符放置在字符串末尾之后,因此原始文件中的每个换行符都会有一个垃圾字符。

相反,您可能想保留原始文件的字节。为此,请尝试以

"rb"
模式打开文件,以二进制模式读取它,这样可以防止文件中的
\r\n
更改为内存中字符串中的
\r

© www.soinside.com 2019 - 2024. All rights reserved.