文件输入,试图从字符串中提取 Int(C++)

Posted

技术标签:

【中文标题】文件输入,试图从字符串中提取 Int(C++)【英文标题】:File Input, trying to get extract Int's from a string (C++) 【发布时间】:2014-08-28 11:47:06 【问题描述】:

大家好,我正在尝试将此列表与文本文件分开

15

Albert Einstein 52 67 63

Steve Abrew 90 86 90 93

David Nagasake 100 85 93 89

Mike Black 81 87 81 85

Andrew Van Den 90 82 95 87

Joanne Dong Nguyen 84 80 95 91

Chris Walljasper 86 100 96 89

Fred Albert 70 68

Dennis Dudley 74 79 77 81

Leo Rice 95

Fred Flinstone 73 81 78 74

Frances Dupre 82 76 79

Dave Light 89 76 91 83

Hua Tran Du 91 81 87 94

Sarah Trapp 83 98

变成全名,所以是Albert Einstein,然后是他们后面的int作为一个数组。

但是我不知道该怎么做。

这是我迄今为止一直在做的,但它只是不适合我。

void Student::getData(Student * stdPtr, int len)

    int tempt;
    int sucker = 0;

    ifstream fin;
    fin.open("students.dat");
    fin >> tempt;

    while(!fin.eof())
    
        string temp;
        getline(fin, temp,'\n');

        stringstream ss;
        ss << temp;
        ss >> sucker;

        cout << temp << " "<<  sucker <<   endl;
        sucker = 0;
    
    fin.close();

我觉得我有点接近,实际上能够通过字符串流自己获取数字,但我不知道如何向我的程序表明我正在开始一个新学生

感谢大家的帮助!

【问题讨论】:

【参考方案1】:

这是简单的算法(懒得写完整的代码:P)

1) 使用 fin &gt;&gt; temp_str 继续阅读这里 temp_str 是 std::string

2) 使用std::stoi(temp_str) 将字符串转换为整数。

如果它不是整数并且是字符串,它将通过invalid异常。使用此例外:

2A) 最后一个值是 int: 它是新对象的名称数据。

2B) 最后一个值不是 int: 它是名称的下一部分,您应该附加到最后一个字符串。

3) 如果没有抛出异常,则为数字,保存在当前对象中。

4) 继续阅读文件直到结束。

【讨论】:

【参考方案2】:

getline之后尝试这样的事情:

stringstream ss(temp);
string name;
string surname;
ss >> name >> surname;
int i;
while (ss >> i) 
  cout << i << ' ';

//follows a fast fix to manage names with three words
if (!ss.eof())  //we tried to extract an int but there was another string
                 //so it failed and didn't reach eof
  ss.clear();    //clear the error bit set trying to extract a string to an int
  string thirdname;
  ss >> thirdname;
  while (ss >> i) 
    cout << i << ' ';
  

...或查看此示例:https://ideone.com/OWLHjO

【讨论】:

这将失败,Hua Tran Du 91 81 87 94 这与 Andrew Van、Joanne Dong 和 Hua Tran 一起失败,否则效果很好 @user3711771 我没有记下名字这三个词。有很多方法可以处理它,这里有一个快速工作的修复程序。您可以将其重新排列成更好的代码。【参考方案3】:

我只是向您介绍如何从一行中分离整数和字符串。所以从这里你可以实现你自己的:

#include <iostream>
#include <stdio.h>
#include <bits/stdc++.h>


using namespace std;


int main()

    string in;
    int i,j,k,n;

    scanf("%d",&n);

    getchar();

    for(j=0 ;j<n ;j++)



        getline(cin,in);

        stringstream ss(in);
        string tem;

        vector<string>vstring;
        vector<int> vint;

        while(ss>>tem)

            if(isalpha(tem[0]))
                vstring.push_back(tem);
            else

                k  = atoi(tem.c_str());
                vint.push_back(k);
            

        

        cout<<"String are : ";

        for(i=0 ;i<vstring.size() ;i++)
            cout<<vstring[i]<<" ";

        cout<<"\nIntegers are : ";

         for(i=0 ;i<vint.size() ;i++)
            cout<<vint[i]<<" ";

            cout<<endl;

    



    return 0;

【讨论】:

以上是关于文件输入,试图从字符串中提取 Int(C++)的主要内容,如果未能解决你的问题,请参考以下文章

从文件 c++ 读取和写入的循环问题

如何从 C++ 中的 getline 函数中提取特定的子字符串?

C++ - 从整数数组中插入和提取字符

C语言编程:从字符串中提取数字

c++ 怎样提取一个字符串中的连续数字并放到另一个数组中保存? 急!

从字符串 C++ 中提取某些整数