[英]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.