c++ ifstream.read()不读取任何内容?

y4ekin9u  于 2023-05-24  发布在  其他
关注(0)|答案(1)|浏览(223)

我在项目中遇到了一些文件读取问题,所以我编写了以下测试代码。
我特灵通过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
vc9ivgsu

vc9ivgsu1#

这是因为数据未写入磁盘。在调用ofs.write之后,应该调用ofs.flush()ofs.close(),以确保在阅读数据之前将数据写入磁盘。
此外,sizeof content获取从content指针给定地址开始的字符串长度,在64位平台上,对于字符串有8个字符的特定情况,但在其他情况下不起作用。正确的习惯用法是声明一个字符数组,用文字字符串初始化它,然后sizeof给出包含终止nul字符的数组的大小,因此要获得字符串的长度,应该减去1。
所以开头应该是:

/*--------------- write file ----------------*/  
std::ofstream ofs("testfile", std::ios::binary); 
const char content[] = "11223344";               
ofs.write(content, sizeof content - 1);          
ofs.close();

相关问题