小编Ole*_*nov的帖子

以C++方式读取文件并处理可能的错误的便携方式

我想做一件简单的事情:从文件中读取第一行,并在没有此类文件,没有读取文件的权限等情况下进行正确的错误报告.

我考虑了以下选项:

  • std::ifstream.不幸的是,没有可移植的方式来报告系统错误.其他一些答案建议errno在读取失败后进行检查,但标准并不保证errno由iostreams库中的任何函数设置.
  • 空调风格fopen/ fread/ fclose.这有效,但不像iostreams那样方便std::getline.我正在寻找C++解决方案.

有没有办法用C++ 14和boost来实现这个目的?

c++ file-io boost

15
推荐指数
2
解决办法
2777
查看次数

Mac OS X POSIX不兼容吗?(timer_settime)

我用C++编写了一个使用timer_settimeUbuntu下的函数的程序,然后让我的朋友尝试在Mac OS X下编译它.手册页timer_settime说这个函数符合POSIX.1-2001,但是在OS X下(声称符合POSIX)g ++给出了编译错误.Web搜索显示OS X API中不存在此功能.

这是否意味着OS X不完全符合POSIX,或者我误解了POSIX兼容性意味着什么?

编辑:我查看了POSIX草案,并在第2063页的系统界面的字母顺序列表中找到了这个函数,就像标准的C函数旁边一样printf,因此在我看来这不是timer_settime标准的某种扩展.

unix macos posix

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

为什么不再引用时自动删除UNIX域套接字?

当进程将名称绑定到TCP套接字(即ip:端口对)并退出时,它不必显式清除任何内容:另一个进程可以重用相同的ip:port.与Linux上的抽象UNIX套接字相同(sun_path以零字节开头).但是,当使用传统的UNIX套接字时,必须unlink在不再需要它之后(或者之前bind,因为你可以删除重要的东西,这不是很好).

根据我的观察,一旦引用UNIX套接字的最后一个文件描述符被关闭,套接字文件就是无用的垃圾:open返回ENODEV,connect返回ECONNREFUSEDbind返回EADDRINUSE.人们可以(并且必须)做的唯一事情是unlink.

操作系统不应该在不再使用时自动从文件系统中删除套接字文件?

linux posix unix-socket

5
推荐指数
0
解决办法
356
查看次数

处理特定类型元素的任何容器的非模板函数

我想要一个标题中描述的功能。

我注意到,与包含任何类型(int、double)元素的任何类型(列表、向量等)容器一起工作的 STL 算法通过使用迭代器类型作为模板参数来提供通用性,例如

template<typename _II, typename _OI>
inline _OI
copy(_II __first, _II __last, _OI __result)
Run Code Online (Sandbox Code Playgroud)

这是一个很好的方法,直到该算法适用于任何类型的元素。元素类型的唯一要求是它必须具有复制构造函数。

但是假设我们有一个具体的类型

class MyElement
{
    public:
    void doSomethingWithElement();
};
Run Code Online (Sandbox Code Playgroud)

并且我们想通过调用 function 来实现一个处理这种类型元素数量的函数doSomethingWithElement()

编写一个接收特定类型容器的函数不是很方便,因为许多容器以相同的方式处理(例如迭代器),如果需要处理不同类型的容器,我们将被迫复制代码。编写模板工作正常,但它看起来很丑,因为我们必须在声明它的地方(在头文件中)实现函数。此外,当我们只想处理一种类型的元素时,参数化这种类型并不是实现目标的正确方法。

我一直在考虑可以像这样使用的迭代器接口

void processContainer(IIterator<MyElement> begin, IIterator<MyElement> end);
Run Code Online (Sandbox Code Playgroud)

如果这个迭代器具有在派生类中实现的纯虚 operator++ 和 operator*,我们可以将这些对象传递给processContainer. 但是有一个问题:如果IIterator是抽象类,我们不能在实现中实例化它processContainer,如果我们传递一个指针给IIterator,这个函数就可以修改它。

有没有人知道任何其他黑客来做到这一点?或者是比上面这些更好的另一种方法?提前致谢。

c++ containers templates iterator

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

QString来unicode std :: string

我知道有很多的信息有关转换QStringchar*,但我还是需要一些澄清这个问题.

Qt提供QTextCodecs转换QString(内部存储unicode中的字符)QByteArray,允许我检索char*哪些代表一些非unicode编码中的字符串.但是当我想要一个unicode时我该怎么办QByteArray

QTextCodec* codec = QTextCodec::codecForName("UTF-8");
QString qstr = codec->toUnicode("??????");
std::string stdstr(reinterpret_cast<const char*>(qstr.constData()), qstr.size() * 2 );  // * 2 since unicode character is twice longer than char
qDebug() << QString(reinterpret_cast<const QChar*>(stdstr.c_str()), stdstr.size() / 2); // same
Run Code Online (Sandbox Code Playgroud)

上面的代码按照我的预期打印"Юникод".但是,我想知道这是否是去unicode的正道char*QString.特别是,reinterpret_cast这种技术中的s和大小算术看起来非常难看.

unicode encoding qstring qt

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

未应用嵌套自定义窗口小部件的样式表(PyQt4)

我希望以下代码在外部主窗口内显示一个小的黑色区域:

class Canvas(QWidget):
    pass

app = QApplication(sys.argv)
outer = QWidget()
w = Canvas(outer)
w.setStyleSheet("background-color: black")
outer.show()
Run Code Online (Sandbox Code Playgroud)

但看起来样式表没有应用:整个外部窗口是灰色的.但是,如果w是a QWidget,则代码按预期工作.当Canvas直接显示实例(没有父项)时,样式表也正确应用:

w = Canvas()
w.setStyleSheet("background-color: black")
w.show()
Run Code Online (Sandbox Code Playgroud)

此代码显示黑色窗口.我在C++中使用Qt 4.8.6尝试过相同的样式,并且样式表也适用于从QWidget派生的嵌套窗口小部件.

我错过了什么?我在Ubuntu 14.04下使用python 2.7.6,Qt 4.8.6和PyQt 4.10.4.

python qt pyqt pyqt4 qtstylesheets

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