当我ifstream用来读取文件时,我遍历文件中的所有行并关闭它.然后我尝试用同一个ifstream对象打开一个不同的文件,它仍然显示End-Of-File错误.我想知道为什么关闭文件不会自动为我清除状态.那之后我必须clear()明确地打电话close().
他们为什么这样设计它有什么理由吗?对我来说,如果您想将fstream对象重用于不同的文件,那真的很痛苦.
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
void main()
{
ifstream input;
input.open("c:\\input.txt");
string line;
while (!input.eof())
{
getline(input, line);
cout<<line<<endl;
}
// OK, 1 is return here which means End-Of-File
cout<<input.rdstate()<<endl;
// Why this doesn't clear any error/state of the current file, i.e., EOF here?
input.close();
// Now I want to open a new file
input.open("c:\\output.txt");
// But I still get EOF error
cout<<input.rdstate()<<endl; …Run Code Online (Sandbox Code Playgroud) 三规则(也称为三巨头或三巨头的规则)是C++中的经验法则,它声称如果一个类定义了下面的一个,它应该明确地定义所有三个:析构函数,复制构造函数,复制赋值运算符.
为什么非默认构造函数不被视为其中之一?当在类中管理任何资源时,程序员必须始终定义非默认构造函数.
我很清楚手册页由部分 stman(2)讨论系统调用和man(3)讨论库函数分开。我也知道fopen(C 库函数)和open(系统调用)之间的区别。但有什么区别open(2)和open(3)?
它来到我面前时,我正在寻找O_DIRECT在手册页(用于直接I / O) open。奇怪的是,我发现它是版本open(2) 中的有效标志,但不是open(3)。
这很有趣。我知道这open(2)是一个 Linux 系统调用(也许我应该说 *nix?)。而且 AFAIK,没有 C 库函数称为open. 那是什么open(3)?
我在网上进行了一些搜索,但没有找到任何明确回答我的问题的内容。这是否来自 POSIX 标准?这是我能猜到的最后一件事。如果这是真的,有什么区别?是否open(2)仅在 Linuxopen(3)中实现,而在 Unix 和 Linux 中(因为 POSIX)。那正确吗?
顺便说一句,如果有人知道为什么O_DIRECT被排除在open(3).
谢谢。
假设我有一个对象向量.对于向量内的每个元素,我想通过成员调用一个函数.代码可以如下所示.
class CMyClass
{
public:
void g();
};
class CAnotherClass
{
public:
void f();
CMyClass m_object;
};
std::vector<CAnotherClass> vec;
// This is easy. What about m_object->g()?
std::for_each(vec.begin(), vec.end(), std::mem_fn(&CAnotherClass::f));
Run Code Online (Sandbox Code Playgroud)
调用f()每个对象就像上面显示的那样简单.如果我想调用m_object->g()每个对象怎么办?希望我不想改变界面CAnotherClass来添加一个虚拟函数来调用m_object->g().
是否有任何STL/boost方式来自己编写循环?
可能重复:
C++检查迭代器是否有效的最佳方法
假设我有一个函数,它将迭代器作为唯一参数,如下所示.
void DoSomethingWithIterator(std::vector<int>::iterator iter)
{
// Check the pre-condition
assert( /* how to validate iter here? */ )
// Operate on iter afterwards
..
}
Run Code Online (Sandbox Code Playgroud)
我怎么知道是否iter有效.通过有效的,我的意思是它指向的载体,例如,从内部的现有元素m_intVector.begin()来m_intVector.end().