无法打印所有整数值

Cannot Print All Integer Values

本文关键字:整数 打印      更新时间:2023-10-16

我想通过读取文件来打印整数值。

代码:

    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。夹在abcdef之间的345是否算作整数取决于您。


我建议使用天顶的解决方案而不是我的。


更新:
以上将CCD_ 16解释为表示整数CCD_。Zenith的解和上述解都将345def解释为表示整数345。对我来说,abc345def345def都应该被拒绝,因为它们代表一个整数。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;
}