c++ - Ifstream 读取特定大小失败(与文件大小无关)

标签 c++ ifstream

我正在尝试读取一个文件,但我意识到它会失败,因为我会尝试读取太多数据,即使该文件比我尝试读取的文件大得多。

该文件是 120 MB,我的 ifstream 在 12967 字节时失败(即使它在 12801 时开始表现得很奇怪。

这是说明我的问题的代码:

#include <fstream>
#include <iostream>
#include <Windows.h>

using std::ifstream;
using std::cout;

#define CORRECT_SIZE 12800
#define CORRECT_BUT_WIERD 12966
#define INCORRECT_SIZE 12967

bool check_error_bits(ifstream* f);

int main()
{
    ifstream myFile("myfile.txt");
    char c[CORRECT_SIZE];
    char c2[CORRECT_BUT_WIERD];
    char c3[INCORRECT_SIZE];

    /*
     * TEST A (works fine)
    */
    myFile.seekg(0, std::ios_base::beg);
    myFile.read(c, CORRECT_SIZE);
    check_error_bits(&myFile);
    cout << myFile.tellg() << std::endl; // Here, tellg() returns 12800

    /*
     * TEST B (works too, but acts wierd)
     */
    myFile.seekg(0, std::ios_base::beg);
    myFile.read(c2, CORRECT_BUT_WIERD);
    check_error_bits(&myFile);
    cout << myFile.tellg() << std::endl; // Here, tellg() returns 16896

    /*
     * TEST C (FAIL)
    */
    myFile.seekg(0, std::ios_base::beg);
    myFile.read(c3, INCORRECT_SIZE);
    check_error_bits(&myFile);
    cout << myFile.tellg() << std::endl; // Here, tellg() returns -1

    system("pause");
}

bool check_error_bits(ifstream* f)
{
    bool stop = false;

    if (f->eof())
    {
        char msg[500];
        strerror_s(msg, errno);
        cout << "1: " << msg << std::endl;
    }

    if (f->fail())
    {
        char msg[500];
        strerror_s(msg, errno);
        cout << "2: " << msg << std::endl;
        stop = true;
    }

    if (f->bad())
    {
        char msg[500];
        strerror_s(msg, errno);
        cout << "3: " << msg << std::endl;
        stop = true;
    }

    return stop;
}

尝试读取少于 12800 字节的内容效果非常好。从 128001 到 12966 是有效的(虽然我没有检查数据是否正确),但是 tellg() 返回的是无意义的。 12966 之后,读取就失败了。

该程序的控制台输出是:

12800
16896
1: No error
2: No error
-1
Press any key to continue . . .

如有任何帮助,我们将不胜感激!

最佳答案

在Windows环境和文本文件中,取值为26=0x1A=^Z的字符作为“文件结束符”。

因此,如果文件不是以二进制形式打开,即使文件更大,也可能会收到意外的 eof。

参见维基百科“文件结尾”(https://en.wikipedia.org/wiki/End-of-file):

在 Microsoft 的 DOS 和 Windows(以及 CP/M 和许多 DEC 操作系统)中,从终端读取永远不会产生 EOF。相反,程序识别源是终端(或其他“字符设备”)并将给定的保留字符或序列解释为文件结束指示符;最常见的是 ASCII Control-Z,代码 26。

关于c++ - Ifstream 读取特定大小失败(与文件大小无关),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32360475/

相关文章:

python - boost python编译模块中缺少库

c++结构问题,在结构中访问var

c++ - java 风格的静态常量初始化

c++ - 为什么我的C++程序只能读取绝对目录而不能读取同一文件夹中的文件?

c++ - 无法从文件中读取一行的所有整数(ifstream)

c++ - boost 错误:变量 ‘timespec rqtp’具有初始化程序,但类型不完整

c++ - CORBA 文件在 Visual C++ 6.0 中未解析的引用

c++ - <fstream> 的 ifstream 无法编译

c++ - 使用 ifstream 和 ofstream 序列化二进制数据时遇到问题

C++:如何优化复制 .txt 文件的其余部分?