我正在学习C++并试图理解为什么EOF字符(Windows上的Ctrl + Z)如果放在一行的末尾就不会破坏while循环.
我的代码:
int main() {
char ch;
while(cin >> ch) {
cout << ch;
}
}
Run Code Online (Sandbox Code Playgroud)
当我输入^ Z时,循环中断.但是当我输入12 ^ Z时,它没有.为什么?
C++ IO流的基类std::basic_ios定义operator void*()为返回!fail()和operator!()返回fail().这让我想知道为什么我们需要它operator!().当然,!is也可以通过隐式调用operator void*()和否定其结果来工作.
我在这里遗漏了什么,还是纯粹出于历史原因而std::basic_ios::operator!()定义的?
一个在comp.lang.c ++的问题.主持并没有带来任何答案要么.
我理解cin.eof()测试流格式.在输入时,输入错误时不会到达字符结尾.我在MSV C++ 2010上对此进行了测试,并没有理解奇怪的结果.无论我给出什么输入,我都会收到程序中存在的格式错误消息.
#include <iostream>
using namespace std;
int main()
{
int i;
cin>> i;
if(!cin.eof())
{
cout<< "\n Format Error \n";
}
else
{
cout<< "\n Correct Input \n";
}
getchar();
return 0;
}
Run Code Online (Sandbox Code Playgroud)
结果我预计:
i =的值
有人可以解释我哪里错了.谢谢.
看看这段代码:
#include <iostream>
using namespace std;
int main()
{
string s;
int n;
float x;
again:
cout << "Please Type this: ABC456 7.8 9 XYZ\n";
cin >> s >> n >> x >> s;
cout << "\nDo you want to try Again(y/n)? ";
char t;
cin >> t;
if (t=='y' || t=='Y')
goto again;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
只需尝试键入"ABC456 7.8 9 XYZ"并按Enter键,它将导致程序退出,然后提示用户再次尝试.我知道输入是错误的,它们不属于它们的类型,但它为什么会导致退出?以及如何避免退出?
我发现自己最近写了很多解析代码(大部分是自定义格式,但并不真正相关)。
为了增强可重用性,我选择将解析函数基于 i/o 流,以便我可以将它们与boost::lexical_cast<>.
然而,我意识到我从未在任何地方读过任何有关如何正确执行此操作的内容。
为了说明我的问题,让我们考虑一下我有三个类Foo,Bar和FooBar:
AFoo由以下格式的数据表示:string(<number>, <number>)。
ABar由以下格式的数据表示:string[<number>]。
AFooBar是一种变体类型,可以容纳 aFoo或 a Bar。
现在假设我operator>>()为我的Foo类型写了一个:
istream& operator>>(istream& is, Foo& foo)
{
char c1, c2, c3;
is >> foo.m_string >> c1 >> foo.m_x >> c2 >> std::ws >> foo.m_y >> c3;
if ((c1 != '(') || (c2 != ',') || (c3 != ')'))
{
is.setstate(std::ios_base::failbit);
}
return …Run Code Online (Sandbox Code Playgroud) 我有一个包含一堆单词的txt文件,每行一个.我需要读取这个文件,并把每个单词的列表,然后用户就可以修改此列表编辑完成后,程序会写一个新的文件修改的列表.
因为它是c ++的对象,我将有两个类,一个用于读/写文件,另一个用于编辑/混淆列表和用户.
考虑到这种方法,这是我在第一节课中的阅读功能:
bool FileMgr::readToList(list<string> &l)
{
if(!input.is_open())
return false;
string line;
while(!input.eof())
{
getline(input, line);
l.push_back(line);
}
return true;
}
Run Code Online (Sandbox Code Playgroud)
请记住:输入是在构造函数中打开的.问题:是否有一种不那么多余的方法可以从istream中获取该死的线并将其推回l?(中间没有'字符串').除了问题,这个功能似乎正常.
现在输出功能:
bool FileMgr::writeFromList(list<string>::iterator begin, list<string>::iterator end)
{
ofstream output;
output.open("output.txt");
while(begin != end)
{
output << *begin << "\n";
begin++;
}
output.close();
return true;
}
Run Code Online (Sandbox Code Playgroud)
这是我主要的一部分:
FileMgr file;
list<string> words;
file.readToList(words);
cout << words.front() << words.back();
list<string>::iterator begin = words.begin();
list<string>::iterator end = words.end();
file.writeFromList(begin, end);
Run Code Online (Sandbox Code Playgroud)
感谢您的帮助,这两个功能现在都有效.现在关于样式,这是实现这两个功能的好方法吗?getline(输入,线)部分我真的不喜欢,任何人都有更好的主意?
问题是:"写一个函数来找出一个数字是一个素数还是一个完整的数字."
到目前为止,我已经完成了最完美的部分,这就是我所拥有的:
#include <iostream>
using namespace std;
bool perfectNumber(int);
int main()
{
int number;
cout<<"Please enter number:\n";
cin>>number;
bool perfectNumber(number);
return 0;
}
bool perfectNumber(int number)
{
int i;
int sum=0;
for(i=1;i<=number/2;i++)
{
if(number%i==0)
{
sum+=i;
}
}
if (sum==number)
return i;
else
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是,这段代码似乎有错误.我查看了这本书,但没有谈论这个话题.我想获得有关如何修复此代码的建议.
谢谢!
我有这个文本样本
Ahmed 10
kmal 5
doola 6
Run Code Online (Sandbox Code Playgroud)
我正在使用此代码来阅读它
if (myfile.is_open())
{
while ( myfile.good() )
{
myfile >> name;
myfile >> phone;
cout << name <<" "<<phone<<endl;
}
myfile.close();
Run Code Online (Sandbox Code Playgroud)
}
我得到了这个输出
Ahmed 10
kmal 5
doola 6
doola 6
Run Code Online (Sandbox Code Playgroud)
为什么这段代码会读取最后一行两次?