C语言 阅读文件时溢出

i5desfxk  于 2023-10-16  发布在  其他
关注(0)|答案(1)|浏览(128)

当阅读一个简单的文件时,我总是溢出并从文件中阅读字节,尽管在读取之前我已经确定了文件的字节大小。
以下是我的当前代码:

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

希望这足够清楚!

de90aj5v

de90aj5v1#

当您以"r"模式读取文件时,您是在文本模式下进行阅读,并且您的双字节\r\n行结束符将转换为内存中的\n字符串。但是ftell返回的是文件的长度(以字节为单位)(每个换行符计算两个字节)。但是,您是根据文件中的字节数(而不是字符串中的字符数)来标记字符串的结尾(通过设置空字符)。因为你已经把null终止符放在了字符串的末尾,所以在原始文件中,每一个换行符都有一个垃圾字符。
相反,您可能希望保留原始文件的字节。要做到这一点,请尝试以"rb"模式打开文件,以二进制模式读取它,这应该可以防止它将文件中的\r\n更改为内存中字符串中的\n

相关问题