小编Eri*_*c Z的帖子

为什么不自动关闭文件清除错误状态?

当我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++ fstream

2
推荐指数
1
解决办法
944
查看次数

为什么在三规则中不考虑非默认构造函数?

三规则(也称为三巨头或三巨头的规则)是C++中的经验法则,它声称如果一个类定义了下面的一个,它应该明确地定义所有三个:析构函数,复制构造函数,复制赋值运算符.

为什么非默认构造函数不被视为其中之一?当在类中管理任何资源时,程序员必须始终定义非默认构造函数.

c++ rule-of-three

1
推荐指数
1
解决办法
429
查看次数

为什么手册页中有两个版本的 open()?

我很清楚手册页由部分 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).

谢谢。

c linux posix

1
推荐指数
1
解决办法
190
查看次数

STL/boost方式为向量内的每个对象间接调用方法

假设我有一个对象向量.对于向量内的每个元素,我想通过成员调用一个函数.代码可以如下所示.

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++ boost stl

0
推荐指数
1
解决办法
164
查看次数

有没有办法验证STL容器的迭代器?

可能重复:
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().

c++ stl

0
推荐指数
1
解决办法
774
查看次数

标签 统计

c++ ×4

stl ×2

boost ×1

c ×1

fstream ×1

linux ×1

posix ×1

rule-of-three ×1