文件输入,试图从字符串中提取 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 >> 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++ 中的 getline 函数中提取特定的子字符串?