如果流读取在特定大小(与文件大小无关)失败
Ifstream read fails at a specific size (unrelated to file size)
我试图读取一个文件,我意识到它会失败,因为我将试图读取太多的数据,即使文件比我试图读取的要大得多。
文件是120mb,我的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之后,read失败。
该程序的控制台输出为:
12800
16896
1: No error
2: No error
-1
Press any key to continue . . .
任何帮助将不胜感激!
在Windows环境和文本文件中,值为26=0x1A=^Z的字符被视为"end to file"
因此,如果文件不是以二进制形式打开,即使文件更大,也可能收到意外的eof。
参见维基百科"文件结束"(https://en.wikipedia.org/wiki/End-of-file):
在Microsoft的DOS和Windows(以及CP/M和许多DEC操作系统)中,从终端读取永远不会产生EOF。相反,程序识别源是一个终端(或其他"字符设备"),并将给定的保留字符或序列解释为文件结束指示符;最常见的是ASCII Control-Z,代码26。
您有一个16,896字节的文件。第一次阅读效果很好。第二次读取遇到文件结束,只能读取16,896字节。第三次读取失败,因为您没有清除流上的文件结束标志。
您可能也有一个120MB的文件,但这无关紧要。检查代码中文件的大小。(或者它可能是120MB的二进制数据,但你在文本模式下读取它。)
你写了
(虽然我没有检查数据是否正确)
这样做,因为我认为数据是正确的。
我假设你使用的是windows,所以:为什么资源管理器不能决定文件的大小?
也https://superuser.com/questions/567175/why-is-the-folder-size-in-properties-different-from-the-total-file-folder-size
- 读取某些文件时出现分段错误,似乎与文件大小无关
- 构建挂起,即使是适度的文件大小
- 如何在Windows内核中获取文件大小
- 为什么 QFileSystemWatcher 会发出多个信号?而 QFileInfo 首次写入零文件大小
- 使用 C++ iOS::ate 获取错误的文件大小
- 相同的源代码,不同的可执行文件大小?
- 为什么未关闭的文件大小为 4 字节
- 读取二进制文件大小的短自上周以来停止工作
- 如何减小C++标准库libstdc++.so文件大小
- 文件大小和缓冲区过冲
- 如何从范围 v3 的istream_range中检索文件大小?
- 如何使用直接IO编写一个带有扩展文件大小的小文件
- 如何使用文件系统库获取"true"文件大小?(C++17)
- 如何限制文件大小,以便我的程序在变大之后创建一个新文件?并编辑新创建的文件的名称
- 如何使用C 17获取文件大小
- HttpQueryInfo 获取文件大小
- 二进制文件大小大于预期的 c++
- 如何计算预期的核心文件大小
- C :不正确的文件大小计算Winapi
- 如果流读取在特定大小(与文件大小无关)失败