我在项目中遇到了一些文件读取问题,所以我编写了以下测试代码。
我特灵通过ifstream.read()
读取一个文件,但已经读取了任何内容。
我已经搜索了许多相关的问题,但仍然不能找出为什么我的代码不工作。请帮帮忙。
#include <iostream>
#include <fstream>
int main() {
/*--------------- write file ----------------*/
std::ofstream ofs("testfile", std::ios::binary);
const char *content = "11223344";
ofs.write(content, sizeof content);
system("chmod 777 testfile");
/*--------------- read file ----------------*/
char arr[8] = {0};
const int length = sizeof arr / sizeof arr[0];
std::ifstream ifs("testfile", std::ios::binary);
std::cout << "good: " << ifs.good() << std::endl; // 1
ifs.seekg(0, ifs.end);
int file_size = ifs.tellg();
ifs.seekg(0, ifs.beg);
std::cout << "file_size: " << file_size << std::endl << std::endl; // 0
if (ifs) {
ifs.read(&arr[0], 2);
std::cout << "after read," << std::endl;
std::cout << "gcount: " << ifs.gcount() << std::endl; // 0
std::cout << "good: " << ifs.good() << std::endl; // 0
ifs.read(&arr[2], 2);
ifs.read(&arr[4], 2);
ifs.read(&arr[6], 2);
} else {
std::cout << "file not found" << std::endl;
}
for (int i = 0; i < length; ++i) {
printf("%d ", arr[i]);
}
printf("\n");
}
输出为
good: 1
file_size: 0
after read,
gcount: 0
good: 0
0 0 0 0 0 0 0 0
1条答案
按热度按时间vc9ivgsu1#
这是因为数据未写入磁盘。在调用
ofs.write
之后,应该调用ofs.flush()
或ofs.close()
,以确保在阅读数据之前将数据写入磁盘。此外,
sizeof content
获取从content
指针给定地址开始的字符串长度,在64位平台上,对于字符串有8个字符的特定情况,但在其他情况下不起作用。正确的习惯用法是声明一个字符数组,用文字字符串初始化它,然后sizeof给出包含终止nul字符的数组的大小,因此要获得字符串的长度,应该减去1。所以开头应该是: