2016-11-05 95 views
0

我有這樣的例子,如何從文本文件的同一行讀取字符串和整數?

在我的txt文件,我有「喬治·薩萊瓦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; 

有了這個,我只得到了第一個名字( 「豪」),我不確定如何在編譯器名稱/字符串結束時告訴編譯器。

+1

怎麼會告訴你用簡單的英語人時名結束? –

+1

你爲什麼不把名字讀成兩個字符串作爲姓和名? –

+0

@EliSadoff好主意,但如果我想要全名「Jorge Silva Pereira」,我的意思是,假設我有很多名字,而且這些名字有3個字,其他4個,其他5個,我怎麼知道字符串結束? –

回答

-1

試試這個代碼

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; 
+0

如果文件中有多行,那麼你將它保存在數組中,這個過程將在while循環中完成。 – suleman

0

大多數情況下,使用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]); 
} 
1

你試圖把字符串(第二個)放到一個數字中,那就是意外輸出的原因。 Directing it to a string應該解決這個問題。你可以丟棄字符串,沒關係。

string line, name, dummy; 
int number; 
while(getline(ifi, line)){ 
    istringstream iss1(line); 
    iss1 >> name; 
    iss1 >> dummy; 
    iss1 >> number; 
} 
+0

你可以選擇做一行iss1 >> name >> dummy >> number ...使你的代碼更簡潔.. :) –

1

有一個解決方案,我可以看到你的問題。如果你想要有多個名字(不管大小),然後在前面有一個數字,你可以利用isdigit函數。

在你同時週期從您可以添加類似的文件讀取時:

String temp; 
Is >> name; 
While (is){ 
Is >> temp; 
If(isdigit(temp[0])) 
     Number = atoi(temp.c_str()); 
Else 
     name += " " + temp; 
    } 

這樣,你可以有多種尺寸的名稱。

我正在寫手機,所以這很難,但你可以瞭解我在說什麼。但不要忘記包括圖書館。

0

您可以選擇保留提取爲整數,除非成功

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; 
} 
相關問題