2014-11-07 58 views
1

下面的代碼是爲了從文件「float.txt」中計算所有浮動數字。問題是浮動數字之間有垃圾信息。爲什麼浮動輸入文件不工作C++

示例文件:

23.5 aujsaN8.2<:::32 

第一浮點後得到,while循環永遠不會結束,程序不再從文件的任何信息。請幫忙。

int main() 
{ 
    float num; 
    ifstream input("float.txt"); 

    input >> num; 
    while (!(input.eof())) 
    { 
     input >> num; 
    } 
    input.close(); 

    return 0; 
} 
+0

你想要發生什麼? – 0x499602D2 2014-11-07 00:17:43

+0

明顯的解決方案是在處理之前清理float.txt。 – 2014-11-07 00:41:21

+1

[不要在循環條件中使用eof](http://stackoverflow.com/questions/5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) – 2014-11-07 00:41:42

回答

2

你可以做這樣的事情:

decltype(input)::Traits::int_type c; 
while ((c = input.peek()) != decltype(input)::Traits::eof()) 
{ 
    if (std::isdigit(c)) 
    { 
     input >> num; 
     ... use num ... 
    } 
    else 
     input.get(); 
} 

這裏的想法是peek下一個字符,如果它是一個數字,然後我們知道>>流至double會成功,否則我們其實get()字符將其從輸入流中刪除。

,如果你需要提取負數它變得棘手(提示:一個辦法 - 用bool跟蹤如果看到c的最後一個值是-,然後使用num之前有if (the_bool) num = -num;)。雖然上面的代碼處理X0.23X - > 0.23,您可能需要也可能不需要處理X.23X - 如果是的話,請檢查.,然後查看下一個字符是否是數字......棘手的是,偷看數字意味着您已經消耗.,所以它不會在那裏爲input >> num ...你可以嘗試input.putback('.'),但我不確定這是標準要求工作時,你已經消耗了一個角色然後偷看 - 你必須檢查... 。

+0

@ 0x499602D2:乾杯: - )。 – 2014-11-07 00:23:57

+0

即時通訊新手到C++ ...你可以嘲笑我嗎? – Machination 2014-11-07 01:13:51

+0

@機器:哪些位?基本上......將'decltype(input):: Traits :: int_type'簡化爲'int'和'decltype(input):: Traits :: eof()'很可能是'-1' - 傳統的' int'表示EOF狀態。至於'peek'和'get' - 假設你輸入了「A123Z」 - 最初'peek()'會返回'A',但是如果你得到(),那麼下一個窺視就會看到'1', 'std :: isdigit(c)'將變爲'true',然後'input >> num'從流中刪除''123''並將'123'放入'num'中,然後下一個'peek()'和'get()'見'Z',然後最後一個'peek()'報告''eof' .... – 2014-11-07 03:35:17

-1

這個作品

// g++ -o parse_float_file parse_float_file.cpp -std=c++11 

#include <iostream> 
#include <fstream> 
#include <string> 

int main() { 

    float curr_number; 
    std::ifstream inFile("float.txt"); 
    std::string line; 

    while(getline(inFile, line)) { 

     try { 

      curr_number = std::stof(line); 

      std::cout << "-->" << curr_number << "<--" << std::endl; 

     } catch (const std::exception &e) { 

      std::cout << "ERROR - not a float : " << line << std::endl; 
     } 
    } 

    return 0; 
} 
+0

讀取文件,但不會從其他文本中提取'float'值題.... – 2014-11-07 00:25:01

0

看,我不知道如何聲明輸入>> NUM;作品我從來沒有使用過,而是我會做這些以便從指定的文件中提取花車。

float floats=0; 
char string[100], ch; 
while (file.get(ch)!=' ') 
{ 
string[i]=ch; 
i++; 
} 
string[i]='\0'; 
floats=atof(string); 

這個程序簡單地複製字符,直到一個「」(空格)被發現,如文件ü所示,那麼函數AOTF()將字符串轉換爲浮點數。 這是你的問題的答案??如果是的話請投票+1,如果有任何問題你可以問我,我一定會幫你...