无法打印所有整数值
Cannot Print All Integer Values
我想通过读取文件来打印整数值。
代码:
int temp;
char* trainname;
trainname="dfg.txt";
ifstream trainfile;
trainfile.open(trainname);
if(!trainfile){
cout<<"Cannot open file!"<<'n';
exit(1);
}
while(trainfile >> temp)
cout << temp << " ";
trainfile.close();
dfg.txt:1 2 we er rf 5
输出:1 2
问题是它没有打印5
。
先读取一个临时字符串,然后使用std::stoi
尝试从中解析一个整数,如果成功,则输出:
std::string temp;
while(trainfile >> temp) {
try {
std::cout << std::stoi(temp) << " ";
}
catch(const std::invalid_argument&) {
// not a valid number
}
}
while(trainfile >> temp)
cout << temp << " ";
上面在遇到任何不是空白或数字的字符时,在trainfile
上设置failbit
。这终止了循环。这是我倾向于不使用可能在输入流上失败的格式化I/O的原因之一。我发现最好把文本读成文本(而不是数字),然后处理刚刚读取的字符串。例如,请参见天顶的答案。
如果您坚持从输入流执行所有操作,则需要一个外部循环来清除流的failbit
。例如,
while (! std::cin.eof())
{
while (std::cin >> temp)
{
std::cout << temp << " ";
}
std::cin.clear();
std::cin.ignore();
}
给定一个包含1 2 we er rf 5
的输入文件,上面将打印1 2 5
。如果输入文件包含1 2 abc345def 6
,则上面的文件将打印1 2 345 6
。请注意,天顶的方法将打印1 2 6
。夹在abc
和def
之间的345
是否算作整数取决于您。
我建议使用天顶的解决方案而不是我的。
更新:
以上将CCD_ 16解释为表示整数CCD_。Zenith的解和上述解都将345def
解释为表示整数345
。对我来说,abc345def
和345def
都应该被拒绝,因为它们代表一个整数。6.1
也应该如此,但0x abc345def
没有错。C标准库中有一个很好的工具strtol
,可以很好地解析整数。它还指示是什么导致解析停止。对于一个有效的整数,它应该停止在输入字符串的末尾。据此,
#include <iostream>
#include < fstream>
#include <string>
#include <cstdlib>
int main ()
{
std::ifstream trainfile("dfg.txt");
if (!trainfile)
{
std::cerr << "Cannot open file!n";
exit(1);
}
std::string s;
while(trainfile >> s)
{
char* end;
long num = std::strtol (s.data(), &end, 0);
if (!*end)
{
std::cout << num << " ";
}
}
trainfile.close();
std::cout << "n";
}
string temp;
if( '0' <= temp[0] && temp[0]<='9' )
cout << temp << " ";
我想它会起作用的。
以下是您可以考虑的另一种方法-
#include <iostream>
#include <sstream>
#include <fstream>
using namespace std;
int main()
{
ifstream trainname("dfg.txt",ios::in);
string temp;
getline(trainname,temp);
stringstream str;
str<<temp;
int extract_int;
while(getline(str, temp,' '))
{
if(stringstream(temp)>>extract_int)
cout<<extract_int<<" ";
}
return 0;
}
或者根据David Hammen的答案,您可以通过以下方式解决问题-
#include <iostream>
#include <sstream>
#include <fstream>
using namespace std;
int main()
{
int temp;
char* trainname;
trainname="dfg.txt";
ifstream trainfile;
trainfile.open(trainname);
if(!trainfile){
cout<<"Cannot open file!"<<'n';
exit(1);
}
while (!trainfile.eof())
{
while (trainfile>>temp)
cout<<temp<< " ";
trainfile.clear();
trainfile.ignore();
}
return 0;
}
相关文章:
- 在一定长度后从数组中打印时缺少整数
- 如何打印boost多精度128位无符号整数
- 为什么有时我输入一个整数,程序将第一个输入的数字打印成十进制数?
- 必须首先打印向量 v1 中最接近整数 x 的数字<int>
- C++ 将打印格式从整数 2255 更改为 $xx.xx
- 如何打印不带空格的输入整数?
- std::带有颜色和标题的 clog 包装器无法正确打印整数
- 指向整数数组和打印总和的指针
- 为什么这个程序接受整数和字母数字输入并打印它们? C++ 中的 std::string 也采用整数值吗?
- 打印出两个整数之间的偶数
- 无法在 Visual Studio 2019 中打印整数
- 将矢量的整数内容打印为字符串会导致分割错误
- 编写一个程序,输入整数 n 并打印该数字的字符数(符号除外)
- C++,尝试打印整数时cout的奇怪行为
- C++声明多个整数会打印不同的值
- 在 C++11 中打印编译时整数序列
- 打印整数总和 > 0
- 如何以相反顺序C 打印整数的单个数字
- 将数组与整数打印为十六进制
- 将整数打印为以小端序排列的4个字节的集合