草庐IT

c++ - 初始化对 istream 的引用

我正在尝试编写我的程序,以便它可以处理StdIn或命令行上指定的文件。我通过尝试初始化对istream的引用来引用cin或ifstream,使用条件.(描述了类似的技术here和here)但是当我尝试使用ifstream时,我似乎收到一个错误,指出basic_istream移动构造函数被声明为protected。istream&refToCIN(cin);//ThisisOKconstistream&refToFile=ifstream(args[1]);//ThisisOKconstistream&inStream(FileIsProvided()?ifstream(args[1])

c++ - 确定 std::istream 长度的更好方法?

是否有比以下方法更好的方法来确定std::istream的长度:std::istream*pcStream=GetSomeStream();pcStream->seekg(0,ios::end);unsignedintuiLength=pcStream->tellg();必须搜索到流的末尾然后返回到原始位置似乎真的很浪费,尤其是当流可能指向某些慢速媒体(如CD或DVD)上的文件时。 最佳答案 “最好”的方法是避免需要长度:)并非所有流都是可搜索的(例如,想象网络套接字上的istream)tellg()的返回类型不一定是数字(唯一的要

c++ - make 失败,返回错误 "cannot convert ‘std::istream {aka std::basic_istream<char>}’ 到 ‘bool’”

我正在尝试从源代码编译libgtextutils(fastxtoolkit需要)。“./configure”命令运行良好,但随后的“make”命令产生了一个我无法解决的错误。text_line_reader.cpp:Inmemberfunction‘boolTextLineReader::next_line()’:text_line_reader.cpp:47:9:error:cannotconvert‘std::istream{akastd::basic_istream}’to‘bool’inreturnreturninput_stream;^~~~~~~~~~~~make[3]:*

c++ - 使用 istream 读取空终止字符串的最简单方法?

我有一个istream,我需要准确读取特定数量的字节,但我不知道它的长度。它是空终止的。我在想我可以1)写一个循环并一次读取一个字节2)告诉它返回一个缓冲区或字符串,它从现在开始直到某个字节(在本例中为0)。或3)一次只读入一个buf并检查它是否为0,如果不是,则将其附加到字符串。第3个我知道我可以,但其他2个听起来可能可以使用istream(在这种情况下它是一个文件流)。我仍在阅读istream的文档。有很多。 最佳答案 因为你不知道它的长度最简单的是:std::stringstrBuf;std::getline(istream,

c++ - 使用 istream::seekg 是不是太贵了?

在c++中,使用istream::seekg操作的开销有多大?编辑:我可以通过搜索文件和读取字节来逃脱多少?频率与偏移幅度的关系如何?我正在解析一个大文件(4GB),我想知道是否有必要尝试合并我的一些seekg调用。我认为文件位置差异的大小会产生一定影响——比如如果你在内存中寻找超过一页,它会影响性能——但小的寻找是无关紧要的。这是正确的吗? 最佳答案 这个问题在很大程度上取决于您的操作系统和磁盘子系统。显然,查找本身将花费基本上为零的时间,因为它只是更新一个偏移量。实际上读取会从磁盘中提取一些数据......但是有多少数据取决于很

c++ - libc++ 和 libstdc++ 之间的 istream eof 差异

以下(玩具)程序在链接到libstdc++和libc++时返回不同的东西。这是libc++中的错误还是我不明白istreameof()是如何工作的?我已经尝试在linux和macosx上使用g++运行它,在macosx上使用clang,有和没有-std=c++0x。我的印象是eof()在尝试读取(通过get()或其他方式)实际失败之前不会返回true。这是libstdc++的行为方式,而不是libc++的行为方式。#include#includeintmain(){std::stringstreams;s 最佳答案 编辑:这是由于旧

c++ - 重载 >> istream_iterator 对

这个问题在这里已经有了答案:Dependentnameresolution&namespacestd/StandardLibrary(1个回答)关闭7年前。我正在尝试构建对上的ifstream_iterator。我的代码如下:typedefpairT;istream&operator>>(istream&stream,T&in){stream>>in.first>>in.second;returnstream;}intmain(intargc,char**argv){ifstreaminfile("dummy2");istream_iteratoriit(infile);istream

c++ - 以 std::istream&& 为参数是否合理?

我遇到过这样做的代码:SomeObjectparse(std::istream&&input){....input参数是右值引用,这通常意味着该函数旨在获取参数的所有权。这不是这里发生的事情。parse函数将完全消耗输入流,它需要一个右值引用,因为调用代码将放弃istream的所有权,因此这是一个信号输入流将不可用。我认为这没问题,因为parse函数实际上并没有四处移动对象,因此不存在切出子类型的危险。从parse的角度来看,这基本上表现为一个正常的引用,只是对调用函数有一种可编译的注释,您必须放弃流的所有权。这段代码真的安全吗?还是有一些被忽视的微妙之处导致了这种危险?

c++ - C++ 的 istream::eof() 的不一致是规范中的错误还是实现中的错误?

以下程序演示了std::istream(特别是在我的测试代码中,std::istringstream)设置eof()的方式不一致。#include#includeintmain(intargc,constchar*argv[]){//EXHIBITA:{//Anemptystreamdoesn'trecognizethatit'sempty...std::istringstreamstream("");assert(!stream.eof());//(NotyetEOF.Maybeshouldbe.)//...untilIreadfromit:constintc=stream.get(

c++ - 是否可以在 C++11 中手动设置 istream 失败位

我做了这门课:classobject{//data...public:friendstd::istream&operator>>(std::istream&in,object&o){charc,d;in>>c>>d;if(c==d){/*setthefailbitsomehow*/in.putback(d);in.putback(c);}elseo.set_data(c,d);returnin;}};我正在查看文档(不太好),但找不到设置失败位的正确方法。我关心的原因是我希望能够while(std::cin>>obj)/*dostuff*/;就像一个人可以用int做的那样。但是,如果我