2015-06-27 121 views
1

我想通過閱讀文件來打印整數值。無法打印所有整數值

代碼:

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

+1

你爲什麼不閱讀你正在嘗試使用的函數的文檔? –

回答

4

閱讀到一個臨時字符串,然後再使用std::stoi嘗試從中解析一個整數,如果成功,它輸出:

std::string temp; 

while(trainfile >> temp) { 
    try { 
     std::cout << std::stoi(temp) << " "; 
    } 
    catch(const std::invalid_argument&) { 
     // not a valid number 
    } 
} 
+1

仍然使用輸出運算符<<而不是運算符>>讀取。 ;) – Pixelchemist

+0

謝謝。可能這種解決方案是正確的。但是,函數'stoi'無法解析。雖然我加了'#include '和國旗'-std = C++ 11'。 – srcn

+1

@srcn - 適用於我,鏗鏘++和g ++。你使用什麼編譯器?然而,這個解決方案給出一個包含'6.1','7'的單詞,給出一個包含'7abc890'的單詞。這是否是一種有效的解釋取決於你。如果'7abc890'無效,那麼0x7abc890呢?那麼'077'(以及哪個整數)呢? 「0xdzdz」或「088」怎麼樣? –

0
string temp; 

if('0' <= temp[0] && temp[0]<='9') 

     cout << temp << " "; 

它會工作,我想。

1
while(trainfile >> temp) 
    cout << temp << " "; 

上述集上trainfilefailbit在遇到不是空白或數字的任何字符。這終止了循環。這是我傾向於不使用可能在輸入流上失敗的格式化I/O的原因之一。我發現最好是將文本讀取爲文本(而不是數字),然後處理剛纔讀取的字符串。例如,請參閱zenith的答案。

如果你堅持要從輸入流中做所有事情,你需要一個外部循環來清除流的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 6abcdef夾在345之間是否以整數計爲您自己。


我推薦使用zenith的解決方案。


更新:
上面解釋abc345def作爲表示整數345。 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"; 
} 
0

這裏是你可以考慮─

#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; 
} 

或者根據大衛Hammen的回答,你可以解決它的另一種方式如下way-

#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; 
}