簡體   English   中英

為什么C ++從txt文件中讀取錯誤值?

[英]Why does C++ read values wrong from txt files?

我已經創建了一個從txt文件“database.txt”讀取值的程序,但是當數字是三位數時輸出錯誤

ifstream myfile("database.txt");
int broj_rijeci = 0;
if (myfile.is_open())
{
    while (getline(myfile, line))
    {
        if (line.at(0) == '[')
        {
            int i = line.length() - 2;
            int brojac = 0;
            system("pause");
            while (line.at(i) != line.at(0))
            {
                input = line.at(i);
                ascii_convert(input);
                broj_rijeci = broj_rijeci + input * pow(10, brojac);
                i--;
                brojac++;
            }
        }
    }
    myfile.close();
}
else cout << "Unable to open file";

我的數據庫看起來像這樣:

[311]

輸出為“310”

由於您尚未提供ascii_convert的實現,因此很難判斷問題是存在還是其他地方。 但是,您可以使用std::stringstream大大簡化過程並消除對自己的轉換例程的需要。

#include <sstream>

std::ifstream myfile("database.txt");
if (myfile.is_open())
{
    std::string line;
    while (std::getline(myfile, line))
    {
        if (line.size() > 1 && line[0] == '[' && line[line.size() - 1] == ']')
        {
            int value;
            if(std::istringstream(line.substr(1, line.size() - 2)) >> value)
            {
                // Conversion was a success ... do something with "value"
            }
            else
            {
                // Conversion failed. Handle error condition.
            }
        }
    }
    myfile.close();
}
else std::cout << "Unable to open file";

將代碼修補為SSCCE會顯示預期結果:

 #include <iostream>
 #include <sstream>
 #include <string>
 #include <math.h>

 int main()
 {
     std::istringstream myfile("[311]");
     int broj_rijeci = 0;
     for (std::string line; std::getline(myfile, line); )
     {
         if (2 < line.size() && line.at(0) == '[')
         {
             int i = line.length() - 2;
             int brojac = 0;
             while (line[i] != line[0])
             {
                 char input = line[i];
                 input -= '0';
                 broj_rijeci = broj_rijeci + input * pow(10, brojac);
                 i--;
                 brojac++;
             }
         }
     }
     std::cout << "result=" << broj_rijeci << '\n';
 }

也就是說,這段代碼可能比它需要的慢得多。 例如,計算整數的冪甚至在每次迭代中需要幾次操作,而實際上只需要一次乘法:

#include <iostream>
#include <sstream>

int main()
{
    std::istringstream in("[311]");
    for (std::string line; std::getline(in, line); ) {
        if (2 < line.size() && line.front() == '[' && line.back() == ']') {
            int result(0);
            for (std::string::const_iterator it(line.begin() + 1), end(line.end());
                 std::isdigit(static_cast<unsigned char>(*it)); ++it) {
                result = result * 10 + *it - '0';
            }
            std::cout << "result=" << result << '\n';
        }
        else {
            std::cout << "ERROR: unexpected format on line '" << line << "'\n";
        }
    }
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM