[英]How can i read string and integer, on same line from a text file?
我有這個例子
在我的.txt文件中,我有“ Jorge Saraiva 1321312”
我的.cpp
string line, nome;
int number;
ifstream ifi("nameOfFile.txt");
if(!ifi.is_open()){
cout << "Error opening file" << ends;
}
{
else{
while( getline(ifi,line) ){
istringstream is(line);
is >> nome;
is >> number;
}
ifi.close();
}
cout << nome << endl << number << ends;
有了這個,我只有名字(“ Jorge”),我不確定如何告訴編譯器名稱/字符串何時結束。
您試圖將字符串(第二個)放入數字中,這是導致意外輸出的原因。 將其定向到字符串應該可以解決該問題。 您可以丟棄字符串,沒關系。
string line, name, dummy;
int number;
while(getline(ifi, line)){
istringstream iss1(line);
iss1 >> name;
iss1 >> dummy;
iss1 >> number;
}
對於您的問題,我可以找到一種解決方案。 如果要有多個名稱(無論大小),然后在前面都有一個數字,則可以利用isdigit函數。
在您的while周期中,從文件讀取時,您可以添加如下內容:
String temp;
is >> name;
while (is){
is >> temp;
if(isdigit(temp[0])){
int number = atoi(temp.c_str()); }
else {
name += " " + temp;
}
}
這樣,您可以擁有多個大小的名稱。
我正在用手機寫東西,所以比較難,但是您可以了解我在說什么。 但是,不要忘了包括圖書館。
通常,在處理csv文件時,您的數據用分號或其他字符分隔。 如果您沒有它,那么您必須執行更多高級分析。 您可以為此使用正則表達式:
#include <regex>
// ...
// Pattern
std::regex pattern("([^\\d]+)\\s*([\\d ]+)" );
// ...
// And instead of istringstream
std::smatch sm;
if (std::regex_match(line, sm, pattern)) {
nome = sm[1];
number = std::stoi(sm[2]);
}
您可以選擇繼續提取為整數,除非成功
int number;
string name;
istringstream record(line);
// keep trying till a number is found.
record >> number;
while (record.fail() && !record.eof()) {
record.clear();
string temp;
record >> temp;
name.append(temp);
record >> number;
}
cout << "Name: " << name << endl;
cout << "Number: " << number << endl;
完整的代碼:
#include <iostream>
#include <string>
#include <sstream>
using namespace std;
int main ()
{
string line;
while (getline(cin, line)) {
int number;
string name;
istringstream record(line);
// keep trying till a number is found.
record >> number;
while (record.fail() && !record.eof()) {
record.clear();
string temp;
record >> temp;
name.append(temp);
record >> number;
}
cout << "Name: " << name << endl;
cout << "Number: " << number << endl;
}
return 0;
}
試試這個代碼
string line, firstname,lastname;
int number;
ifstream ifi("nameOfFile.txt");
if (!ifi.is_open())
{
cout << "Error opening file" << ends;
}
else
{
while (ifi>>firstname>>lastname>>number) {}
ifi.close();
}
cout << firstname <<endl<<lastname <<endl << number << ends;
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.