2015-09-23 2 views
0

Я хочу создать фабричный класс, который создает и загружает объекты из файла; Однако, когда я пытаюсь читать в файле int из файла, он возвращает неправильное число.ifstream не возвращает правильное значение int

std::ifstream input; 
input.open("input.txt"); 
if (!input.is_open()){ 
    exit(-1); 

} 

int number; 

input >> number; 
cout << number; 

input.close(); 

Когда я ввожу номер в файле input.txt он показывает: -858993460. Изменение номера не имеет значения, и когда я использую cin вместо ifstream, он работает так, как должен. Я, наверное, просто пропустил что-то действительно глупое, но я не могу понять это.

Редактировать: Использование getLine() работает как должно. Я думаю, есть проблема с использованием >>.

+0

[Почему ты не проверяя операцию ввода?] (http://kayari.org/cxx/yunocheckio.html) Что заставляет вас думать, что он читает _any_ значение, правильно или неправильно, если вы его не проверяете? –

+3

-858993460 - это десятичное значение 0xCCCCCCCC, которое вы получаете за неназначенные переменные. Это потому, что ваша переменная 'number' не была заполнена значением, считанным из файла. –

+0

Что означает _ «когда я ввожу число в файле input.txt» означает? Вы пытаетесь отредактировать файл input.txt во время чтения программы? Что содержит файл при запуске программы? –

ответ

0

Вот еще одно решение, чтобы открыть файл для чтения построчно:

string line; 
ifstream myfile("input.txt"); 
if (myfile.is_open()) 
{ 
    while (getline (myfile,line)) 
    { 
    cout << line << '\n'; // Use this to verify that the number is outputed 
    // Here you can transform your line into an int: 
    // number = std::stoi(line); 
    } 
    // myfile.close(); Use this if you want to handle the errors 
} 

else cout << "Unable to open file"; 

Если вы не хотите, чтобы построчно читать, просто удалите while

... 
getline(myfile,line); 
number = std::stoi(line); 
... 

Прочитать несколько номеров в одной строке

Изображение, что ваш входной файл выглядит так:

1, 2,3, 123, 11

1, 2

0,9, 90

Затем, вы можете использовать этот кусок кода, чтобы прочитать все номера:

string line; 
ifstream myfile("input.txt"); 
string delimiter = ", "; 

if (myfile.is_open()) 
{ 
    while (getline (myfile,line)) 
    { 
    cout << "Reading a new line: " << endl; 
    size_t pos = 0; 
    string token; 
    while ((pos = line.find(delimiter)) != string::npos) { 
     token = line.substr(0, pos); 
     cout << token << endl; // Instead of cout, you can transform it into an int 
     line.erase(0, pos + delimiter.length()); 
    } 
    } 
} 
else cout << "Unable to open file"; 

Выход будет:

Reading a new line: 
1 
2.3 
123 
11 
Reading a new line: 
1 
2 
Reading a new line: 
0.9 
90 

Новое решение, которое может работать =)

Я не проверял, но это работает, по-видимому:

std::ifstream input; 
double val1, val2, val3; 
input.open ("input.txt", std::ifstream::in); 
if (input >> val1 >> val2 >> val3) { 
    cout << val1 << ", " << val2 << ", " << val3 << endl; 
} 
else 
{ 
    std::cerr << "Failed to read values from the file!\n"; 
    throw std::runtime_error("Invalid input file"); 
} 

Чтобы проверить IO см http://kayari.org/cxx/yunocheckio.html

+0

В чем смысл 'myfile. закрыть() '? Не доверяете ли вы деструктору? –

+0

У меня есть привычка всегда закрывать потоки, даже если у них есть деструктор.Я не знаю, хорошая ли это или плохая привычка .. =) Но это ничего не меняет нормально .. – Smeiliz

+0

@Smeiliz: см. [Мой вопрос на codereview.stackexchange.com] (http: //codereview.stackexchange .com/questions/540/implementation-using-fstream-failed-evaluation) – dreamlax