标签: istream

为什么std :: getline()在格式化提取后会跳过输入?

我有以下代码提示用户输入他们的名字和状态:

#include <iostream>
#include <string>

int main()
{
    std::string name;
    std::string state;

    if (std::cin >> name && std::getline(std::cin, state))
    {
        std::cout << "Your name is " << name << " and you live in " << state;
    }
}
Run Code Online (Sandbox Code Playgroud)

我发现该名称已被成功提取,但不是州.这是输入和结果输出:

Input:

"John"
"New Hampshire"

Output:

"Your name is John and you live in "
Run Code Online (Sandbox Code Playgroud)

为什么输出中省略了状态名称?我给出了正确的输入,但代码忽略了它.为什么会这样?

c++ iostream input c++-faq istream

92
推荐指数
2
解决办法
2万
查看次数

使用C++文件流(fstream),如何确定文件的大小?

我确定我在手册中错过了这个,但是如何使用标题中的C++ istream类来确定文件的大小(以字节为单位)fstream

c++ fstream filesize istream

74
推荐指数
5
解决办法
14万
查看次数

从char获取一个istream*

我有一个char*和我从库中收到的数据长度,我需要将数据传递给一个带有istream的函数.

我知道我可以创建一个字符串流但是会复制所有数据.而且,数据肯定会有0,因为它是一个zip文件,创建一个字符串流将把数据带到我认为的第一个0.

有没有办法从char*创建一个istream,它的大小没有复制所有数据?

c++ istream

51
推荐指数
5
解决办法
4万
查看次数

C++流混淆:istreambuf_iterator vs istream_iterator?

istreambuf_iterator和之间有什么区别istream_iterator?一般来说,stream和streambufs有什么区别?我真的找不到任何明确的解释,所以决定在这里问.

c++ istream streambuf

43
推荐指数
2
解决办法
5107
查看次数

为什么istream/ostream变慢

http://channel9.msdn.com/Events/GoingNative/2013/Writing-Quick-Code-in-Cpp-Quickly的 50:40时,Andrei Alexandrescu开玩笑说如何效率/慢速istream.

我过去遇到过一个问题,ostream很慢,而且fwrite明显更快(在主循环运行一次时减少了很多秒),但我从来不明白为什么也没看过它.

什么使得C++中的istream和ostream变慢?或者至少比其他东西(如fread/fget,fwrite)慢,这同样满足了需求.

c++ performance istream ostream

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

逐字节读取二进制istream

我试图使用ifstream逐字节读取二进制文件.我之前使用像get()之类的istream方法一次读取二进制文件的整个块而没有问题.但是我目前的任务有助于逐字节地进行,并依靠io系统中的缓冲来提高效率.问题是我似乎比我应该更快地到达文件的末尾几个字节.所以我写了以下测试程序:

#include <iostream>
#include <fstream>

int main() {
    typedef unsigned char uint8;
    std::ifstream source("test.dat", std::ios_base::binary);
    while (source) {
        std::ios::pos_type before = source.tellg();
        uint8 x;
        source >> x;
        std::ios::pos_type after = source.tellg();
        std::cout << before << ' ' << static_cast<int>(x) << ' '
                  << after << std::endl;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

这会转储test.dat的内容,每行一个字节,显示前后的文件位置.

果然,如果我的文件碰巧有两个字节的序列0x0D-0x0A(对应于回车和换行),则跳过这些字节.

  • 我以二进制模式打开了流.不应该阻止它解释行分隔符吗?
  • 提取操作员总是使用文本模式吗?
  • 从二进制istream中逐字节读取的正确方法是什么?

Windows上的MSVC++ 2008.

c++ binaryfiles istream

23
推荐指数
3
解决办法
3万
查看次数

为什么istream对象可以用作bool表达式?

有谁知道为什么istream对象可以用作bool表达式?例如:

ifstream input("tmp");
int iValue;
while (input >> iValue)
    //do something;
Run Code Online (Sandbox Code Playgroud)

这里input >> iValue返回对ifstream对象的引用.我想知道为什么这个对象可以用作bool表达式.
我查看ifstream类,发现这可能是由于以下成员函数:

operator void * ( ) const;
Run Code Online (Sandbox Code Playgroud)

有关此功能的详细信息,请参见此处
如果是的话,有人可以向我解释这个功能吗?该函数的原型与通常的运算符重载声明不同.这个函数的返回类型是什么?
如果不是,那么ifstream对象可以用作bool表达式的原因是什么?
期待您的帮助!

c++ operator-overloading istream

23
推荐指数
2
解决办法
4577
查看次数

istream :: getline返回类型

istream::getline方法返回什么?

我问,因为我已经看到循环文件,它应该这样做:

while ( file.getline( char*, int ) )
{
    // handle input
}
Run Code Online (Sandbox Code Playgroud)

什么回来了?

c++ file-io getline istream ifstream

17
推荐指数
3
解决办法
2万
查看次数

从 istream 输入到 char* 指针?

我正在阅读 Bjarne Stroustrup 的《C++ 编程原理与实践》(第二版)。在第 660-661 页,作者定义了一个函数,如下所示:

istream& read_word(istream& is, char* buffer, int max)
    // read at most max-1 characters from is into buffer
{
    is.width(max);    // read at most max-1 characters in the next >>
    is >> buffer;     // read whitespace-terminated word,
                      // add zero after the last character read into buffer
    return is;
}
Run Code Online (Sandbox Code Playgroud)

稍后int main(),该函数被调用为read_word(cin,s,max);where cinis std::cin, maxis an int, and sis a chararray of size max …

c++ arrays pointers istream c++20

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

非阻塞std :: getline,如果没有输入则退出

目前我有一个从标准输入读取的程序,如果没有输入,程序偶尔需要继续运行,通常这是一个测试脚本没有'输入'可以这么说.

program -v1 -v2 -v3 <input >output

v1 - v3分别是命令行参数

基本上,如果没有给出"输入",程序会将命令行参数及其各自的含义吐出,然后退出.

但是目前如果给它一个空的测试文件,或者只是在运行std :: getline上的块之后按下输入,我用来输入命令.

while(std::getline(std::cin,foo)
{do stuff}
Run Code Online (Sandbox Code Playgroud)

其中foo是一个字符串.

如何do stuff在没有输入的情况下将其运行至少一次然后退出?如果输入do stuff,则标准输入中的每一行都会发生一次.

是否可以切换到do-while循环,并检查预循环是否有任何输入?

就像是

if cin empty
set flag

do
 {do stuff
 check flag}
while(getline)
Run Code Online (Sandbox Code Playgroud)

或者是非阻塞的,在c ++中是不可能的?

这个问题似乎反复重复,但我找不到一个明确的答案,甚至是一个平台无关的答案(这个程序本质上是学术性的,在windows上编码并在unix上测试).

c++ istream

12
推荐指数
2
解决办法
5577
查看次数