C++ C++;ios:fail()标志
我试图读取大于2GBs(约15GBs)的las文件,但ios::fail()标志在第345字节变为真。下面是代码C++ C++;ios:fail()标志,c++,ifstream,C++,Ifstream,我试图读取大于2GBs(约15GBs)的las文件,但ios::fail()标志在第345字节变为真。下面是代码 void Foo() { char* filename = "../../../../../CAD/emi/LAS_Data/AOI.las"; ifstream m_file (filename); char c; int count = 0; if (m_file.is_open()) { while ( m_file.good() )
void Foo()
{
char* filename = "../../../../../CAD/emi/LAS_Data/AOI.las";
ifstream m_file (filename);
char c;
int count = 0;
if (m_file.is_open())
{
while ( m_file.good() )
{
m_file.get(c);
cout << c << endl;
count++;
}
// Check State
if(m_file.fail())
cout << "File Error: logical error in i/o operation." << endl;
if(m_file.eof())
cout << "Total Bytes Read: " << count << endl;
m_file.close();
}
else
{
cout << "File Error: Couldn't open file: " << endl;
}
}
我遗漏了什么?我猜你在使用Windows。Windows有一个怪癖,即控件Z标记文本文件的结尾,而不管文件实际有多大。解决方案是以二进制模式打开文件
ifstream m_file (filename, std::ios::binary);
我猜你在用Windows。Windows有一个怪癖,即控件Z标记文本文件的结尾,而不管文件实际有多大。解决方案是以二进制模式打开文件
ifstream m_file (filename, std::ios::binary);
而(m_file.good())
是错误的。哪个资源让你这么做?对于15GB的文件,我最好使用内存映射文件。我尝试了“while(!m_file.eof())”,但没有任何改变。是关于文件的大小吗?但是现在看到错误(第345字节)还为时过早吗?我将尽快搜索内存映射文件。那里的教程在很多方面都很糟糕。循环出错的原因在于,只有在操作失败后才能获得失败位。因此,您必须先阅读一个字符,然后在使用您阅读的内容(或者可能无法阅读的内容)之前检查是否成功。顺便说一句:使用char-const*filename=…
。使用get
读取15GB的文件确实不是一个好主意。它将非常慢。而(m_file.good())
是错误的。哪个资源让你这么做?对于15GB的文件,我最好使用内存映射文件。我尝试了“while(!m_file.eof())”,但没有任何改变。是关于文件的大小吗?但是现在看到错误(第345字节)还为时过早吗?我将尽快搜索内存映射文件。那里的教程在很多方面都很糟糕。循环出错的原因在于,只有在操作失败后才能获得失败位。因此,您必须先阅读一个字符,然后在使用您阅读的内容(或者可能无法阅读的内容)之前检查是否成功。顺便说一句:使用char-const*filename=…
。使用get
读取15GB的文件确实不是一个好主意。这将是非常缓慢的。