- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
在 VS 2005 中,我有一些代码如下所示:
ifs.open("foo");
while (!ifs.eof())
{
ifs.read(&bar,sizeof(bar));
loc = ifs.tellg();
loc += bar.dwHeaderSize;
// four byte boundary padding
if ((loc % 4) != 0)
loc += 4 - (loc % 4);
ifs.seekg(loc,ios::beg);
}
ifs.close();
该代码在 VS 2005 中运行良好,但在 VS 2008 Express 中运行失败。据我所知,VS 2008 在代码查找到文件末尾后没有返回 eof() 。我错过了什么吗?我通过添加一个显式检查以查看查找位置是否超过文件大小来修复它,但我想确保我正确理解 ifstream。
最佳答案
EOF 标志仅在您尝试读取超过文件末尾时触发。
读取 upto
文件末尾不会触发它。
这就是为什么大多数代码看起来像这样:
while(ifs.read(&bar,sizeof(bar)))
{
// Do Stuff
}
如果 read() 的结果上升到 EOF,将进入循环。
如果 read() 的结果超过 EOF,则不会进入循环
原因是读取的结果(返回值)是对流的引用。如果流在 bool 上下文中使用(例如 if 测试表达式),它将转换为可在此类上下文中使用的类型。此转换的结果测试 EOF 标志(以及其他几个标志),如果 EOF 为真,则返回 false 的等价物。
注意:
如果您为您的 Bar 类重载运算符 <<,则此技术会更好地工作,因为它应该准确读取对象所需的内容,而不会超过 EOF。这样就可以更轻松地让您的对象准确读取到文件末尾而无需遍历。我担心 read 的事情是,如果 read() 需要 10 个字节,而文件中只有 5 个字节,那么对于部分填充的对象会发生什么?
如果您想继续使用您的样式,代码应该如下所示:
ifs.open("foo");
while (!ifs.eof())
{
ifs.read(&bar,sizeof(bar));
if (ifs.eof())
{ break;
}
// Do Stuff
}
关于c++ - ifstream seekg beyond end 不在 VS 2008 Express 中返回 eof?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1099601/
我正在尝试制作一个随机名称生成器。问题是为了获得文件中的行数,我必须遍历它。 所以当我需要在 getRandomName() 中再次循环获取名称时,它已经到达文件末尾 我尝试使用 seekg(0, s
我有一个文本文件: 1 2 3 4 5 6 7 8 9 我想用seekg()读取一个特定的数字 ifstream fr("duomenys.txt"); fr.seekg(2,ios::beg); i
在下面的代码中,我计算了字数、行数,然后计算了文本文件的大小。第一次使用 seekg 在第一个 while 循环后工作正常,但在第二个 while 循环后,它不起作用。它给出输出中所示的值。 #inc
我有一个非常大的 (950GB) 二进制文件,我在其中存储了 10 亿个 float 序列。 我拥有的长度为 3 的文件类型的一个小例子可能是: -3.456 -2.981 1.244 2.453 1
我有一个 2884765579 字节的文件。这是用这个函数双重检查的,它返回那个数字: size_t GetSize() { const size_t current_position
#include #include int main() { std::string str; char magic[9]; std
我有一个小程序,旨在从文件中复制一个小短语,但似乎我对 seekg() 的工作方式有误,或者我的代码阻止函数按预期工作。 文本文件包含: //Intro previouslyNoted=false 这
我有一个函数(遗留)读取文件的前几行以确定其类型,然后关闭并重新打开文件,以便它可以使用正确的解释器重新读取整个文件。要点是: void readFile(const char *filename)
我正在使用 Visual C++ 2010 开发 MFC 应用程序 我正在读取一个文件的数据,但似乎 seekg 不工作 这是我的代码 //Transaction is a class i have
所以我尝试使用 cin.get() 两次读入一串字符。输入被重定向为“程序 int main() { std::cin.seekg(1, std::ios::beg); if (std::ci
在对文件使用 seekg 和 tellg 的场景中,我想知道幕后发生了什么? // Open file and get file size int myFileSize; st
在尝试以文本模式 (Windows) 读取一个简单的 ANSI 编码文本文件时,我遇到了 seekg() 和 tellg() 的一些奇怪行为;任何时候我尝试使用 tellg(),保存它的值(作为 po
我正在尝试编写一些简单的代码来读取文本文件,但会读取第一行两次。我认为这会像这样简单 std::ifstream file; file.open("filename", std::io
所以,我很好奇,因为我一直在使用这种相当有用的方法来获取文件的大小,但有些事情困扰着我。将流锁定到文件系统上的文件和 fileStream.seekg(0, std::ios::beg); int b
我正在玩 ifstream 以熟悉它。我正在尝试使用 seekg 来判断文件的位置,但它给了我错误的结果。 想法是: 打开文件 打印文件位置 从文件中读取一个字符 打印文件位置 从文件中读取一个字符
下面的程序应该输出如下内容: Begin found space found End found 但事实并非如此。 #include #include #include #include #i
我正在尝试备份 ifstream 中的一行。 file.tellg() 正在返回一个我没有预料到的值。在下面的示例中,在读取第一行(长度为 15 个字符的字符串)后,我希望 file.tellg()
我正在尝试从特定偏移量读取二进制数据。 我是这样写数据的: long RecordIO::writeRecord(Data *record) { this->openWrite();
代码如下: #include #include #include using namespace std; int main(int argc, char *argv[]) { string
我正在尝试将 bmp 文件读入字符缓冲区,并使用进程间通信将其传输到进程间。我使用以下代码完成了此操作: std::ifstream ImageFile; char* str=ne
我是一名优秀的程序员,十分优秀!