2014-10-21 2 views
0

Я хочу прочитать файл и посмотреть, есть ли в нем 1 или 2 числа. , и если эти 1 или 2 числа не указаны в файле, я хочу попросить пользователя ввести их.Что делать в C++, когда переменная печатает неинициализированную переменную?

Я использую следующий код:

ifstream fin; 

while (!fin.eof()) 
{ 
    fin >> x; 
    counter++; 

    fin >> y; 
    counter++; 
} 

switch (counter) 
{ 
case 0: 
    cout << " Enter the 1st number"; 
    cin >> x; 
    break; 
case 1: 
    cout << " Enter the 2nd number"; 
    cin >> y; 
    break; 
default: 
    break; 
} 

Но если, например, один из номеров не в файле, я получаю неинициализированное значение вместо этого.

+0

Ваши скобки '{}' были сломаны, я представил редактирование, которое, как я думаю, является тем, что вы намеревались. (ожидание экспертной оценки). Надеюсь, это правильно. – Baldrickk

+0

Вы уверены, что в сообщении об ошибке используется слово «содержать»? –

+0

Ваш 'переключатель', вероятно, не делает то, что вы хотите. В случае 0 вы должны спросить у пользователя два входа, нет? Но вы всегда будете «ломаться» после запроса первого ввода. Я думаю, что два 'if' были бы более уместны здесь, но «переключатель» с провалом также будет работать. – 5gon12eder

ответ

2

Вы пытаетесь прочитать обе переменные из файла, даже если вы не знаете, присутствуют ли они.

Я предлагаю проверить для eof каждый раз, когда вы хотите прочитать переменную и проверить на fail, чтобы убедиться, что чтение было в порядке.

if(!fin.eof()) 
{ 
    fin >> x; 
    if(!fin.fail()) 
    { 
     counter++; 
    } 
} 
if(!fin.eof()) 
{ 
    fin >> y; 
    if(!fin.fail()) 
    { 
     counter++; 
    } 
} 

Таким образом, counter будет только увеличиваться, если переменная была правильно прочитать в файле.

Вы можете узнать больше о eof, fail и других iostates.

+2

Почему бы не просто 'if (fin >> x)'? –

+1

Хотя 'if (fin >> x)' кажется более элегантным, проверяя, что именно для флага, который вы ищете, я чувствую, помогает вашему коду быть более явным **. В этом случае любой, кто читает этот фрагмент кода (и знает, что представляет собой 'failbit'), может сказать, что автор проверяет неудачное извлечение из-за ** конца файла ** или ** недопустимого значения **. – Nard

+0

'fin >> x' вряд ли когда-либо вернет' false'. Оператор '>>' в этом контексте всегда возвращает ссылку на 'fin', независимо от успеха или отказа от фактической операции ввода. – dgnuff