我有以下代码提示用户输入他们的名字和状态:
#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)
我发现该名称已被成功提取,但不是州.这是输入和结果输出:
Run Code Online (Sandbox Code Playgroud)Input: "John" "New Hampshire" Output: "Your name is John and you live in "
为什么输出中省略了状态名称?我给出了正确的输入,但代码忽略了它.为什么会这样?
我确定我在手册中错过了这个,但是如何使用标题中的C++ istream类来确定文件的大小(以字节为单位)fstream?
我有一个char*和我从库中收到的数据长度,我需要将数据传递给一个带有istream的函数.
我知道我可以创建一个字符串流但是会复制所有数据.而且,数据肯定会有0,因为它是一个zip文件,创建一个字符串流将把数据带到我认为的第一个0.
有没有办法从char*创建一个istream,它的大小没有复制所有数据?
istreambuf_iterator和之间有什么区别istream_iterator?一般来说,stream和streambufs有什么区别?我真的找不到任何明确的解释,所以决定在这里问.
在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)慢,这同样满足了需求.
我试图使用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(对应于回车和换行),则跳过这些字节.
Windows上的MSVC++ 2008.
有谁知道为什么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表达式的原因是什么?
期待您的帮助!
程
该istream::getline方法返回什么?
我问,因为我已经看到循环文件,它应该这样做:
while ( file.getline( char*, int ) )
{
// handle input
}
Run Code Online (Sandbox Code Playgroud)
什么回来了?
我正在阅读 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 …
目前我有一个从标准输入读取的程序,如果没有输入,程序偶尔需要继续运行,通常这是一个测试脚本没有'输入'可以这么说.
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上测试).