2013-10-04 22 views
0

int數字是此代碼的函數的參數。 first_digit是已經從ifstream的文件C++將整數參數傳遞給函數並將其轉換爲條件字符

else if (number != 0) 
    { 
     std::string number_string = std::to_string(number); 
      while (!file.eof()) 
      { 
       if (first_digit[0] == number_string) 
       { 
        count++; 
       } 
      file >> first_digit; 
      } 

我所試圖做的是有count++當且僅當第一個數字從文件參數int number的char值一致通過了第一個值的字符串。我正在嘗試計算第一位數字匹配的行數numbernumber從一個單獨的函數傳遞,將發送號碼for(i=1;1<10;i++),以便我將以文件中第一個數字的第1,2,3位等次數的總和結束。

我正在努力的是條件!我如何根據它們擁有相同的char值將字符串first_digit的第一個索引位置與int n關聯?例如'1' == '1'因此count++

+0

有沒有可能是你傳遞'字符number'作爲參數傳遞給這些代碼是從功能?畢竟,你想要計算從給定字符開始的行數,而不是給定的數字(如果數字大於9,該數字是多少?) – bennofs

+3

注意:[修復while循環](http://stackoverflow.com/問題/ 5605125/why-is-iostreameof-inside-a-loop-condition-considered-wrong) – WhozCraig

回答

0

數字字符的數值保證增加並且連續。換句話說,我相信你正在尋找這樣的:

if (first_digit[0] == '0' + number) { 
    //... 
} 
+0

只要'number <= 9',它將工作。如果'number'是一個很大的值(例如1000),這會給出*有趣的結果。 –

+0

@ZacHowland它將永遠不會是真的(在8位到字節的硬件上),因爲算法是在int中完成的,first_digit是char。我從這個問題中明白'0 <= number <= 9'是函數的前提條件。 – Angew

+0

我沒有看到任何地方,他說在進入函數之前(也不在函數內)檢查數字,但如果是,那就沒有問題。如果不是,結果將不可取(當一個'int'被降級到'char'並且'int'大於255 ...) –

0

你所試圖做的,如果number是0到9之間。此外只會工作,如果first_digitstring,然後first_digit[0]char ,然後你試圖與string比較(這不起作用)。

else if (number > 0 && number <= 9) // no sense in checking larger numbers unless you convert the base 
{ 
    std::string number_string = std::to_string(number); 
    std::string line; 
    while (std::getline(file, line)) 
    { 
     if (line[0] == number_string[0]) 
     { 
      count++; 
     } 
    } 
} 

,或者,你可以使用std::count_if做這一切爲你,而不是自己寫循環。它看起來像下面這樣(注意:這沒有被調試過):

struct line_reader : std::ctype<char> 
{ 
    line_reader() : std::ctype<char>(get_table()) {} 

    static std::ctype_base::mask const* get_table() 
    { 
     static std::vector<std::ctype_base::mask> rc(table_size, std::ctype_base::mask()); 
     rc['\n'] = std::ctype_base::space; 
     return &rc[0]; 
    } 
}; 

// in your conditional 

else if (number > 0 && number <= 9) // no sense in checking larger numbers unless you convert the base 
{ 
    std::string number_string = std::to_string(number); 
    line_reader myReader; 
    file.imbue(std::locale(std::locale(), myReader)); 
    count = std::count_if(std::istream_iterator<std::string>(file), std::istream_iterator<std::string>(), [&](const string& s) 
    { 
     return s[0] == number_string[0]; 
    }); 
} 
0

首先,你的示例代碼有幾個問題。在C++中,EOF位僅在之後設置爲,您讀取的是文件末尾的內容。這意味着你總是會用你的代碼閱讀一行垃圾郵件。相反,您應該在處理之前檢查您讀取的數據是否真實有效。 (請參閱Why is iostream::eof inside a loop condition considered wrong?

此外,您應該使用std::getline來讀取整行,而不是僅讀取下一個空白字符。

現在解決您的實際問題。如果你知道這個編號總是小於10,你可以用這一招:

char digit = '0' + number 

這工作,因爲每個數字字符的數值始終是一個比以前更大。因此,例如'1'數字字符的數字值將爲'0' + 1,依此類推。

有了這些變化,最終的代碼是:

// Assert that the number is in the required range. 
assert(number < 10 && number >= 0 && "Expected a single digit!"); 
std::string line; 
while(std::getline(file, line)) { 
    if(line[0] == '0' + number) { 
    ++count; 
    } 
} 
相關問題