2013-12-18 5 views
0

Вот мой код:ifstream не удается открыть файл

#include<iostream> 
#include<fstream> 
#include<string> 
using namespace std; 
void getHighScores(int scores[], string names[]); 

int main() 
{ 
    ifstream stream; 
    stream.open("scores.txt"); 
    int scores[32]; 
    string names[32]; 
    stream>>scores[0]; 
    stream>>names[0]; 
    if(stream.fail()) 
     cout<<"It failed\n"<<strerror(errno)<<endl; 
    for(int i=1;i<5;i++) 
    { 
     stream>>scores[i]; 
     stream>>names[i]; 
     cout<<i<<endl; 
    } 
    cout<<scores[2]<<endl; 
    stream.close(); 

    return 0; 
} 

void getHighScores(int scores[], string names[]) 
{ 

} 

Это получить кучу мусора для оценки [2], потому что stream.open («scores.txt») не удается открыть файл. strerror (errno) дает мне «Нет ошибки».

Я проверил, действительно ли мой файл называется «scores.txt.txt». Это не. Я также попытался переместить мой файл в «C: \ scores.txt». Я пробовал использовать полный адрес. Я попытался удалить его и воссоздать. Я пробовал и другие вещи, которые я не помню. ! [введите описание изображения здесь] [1] Я пытался часами исправлять это, и я в отчаянии. Я был бы признателен, если бы кто-нибудь мог помочь мне исправить это.

void gethighscores - это функция, которую я планирую использовать позже.

Входной файл выглядит следующим образом:

Ronaldo 
10400 
Didier 
9800 
Pele 
12300 
Kaka 
8400 
Cristiano 
8000 

Выход программы выглядит следующим образом

It failed 
No error 
1 
2 
3 
4 
-858993460 
Press any key to continue . . . 

Я бегу это в Microsoft Visual Studio Express 2012 для рабочего стола Windows Мой операционной система - это 64-разрядная версия Windows 7.

+0

Вы уверены, что scores.txt действительно существует в вашем [рабочем каталоге] (http://en.wikipedia.org/wiki/Working_directory)? Это не обязательно путь исполняемого файла. Кроме того, попытка открыть файл непосредственно из C: \ может завершиться неудачей по другим причинам (например, разрешениям). Кроме того, вы должны проверить открытый сбой ('stream.is_open()') сразу после вызова open (не только после попытки чтения). – MooseBoys

+0

Это, вероятно, поможет вам значительно проверить правильность выкидывания потока, а не просто слепо предположить, что они работают. Кроме того, * реальная * выборка вашего входного файла, а также * готовый вывод *, который вы получаете, существенно улучшат этот вопрос вместе с платформой, на которой вы работаете. – WhozCraig

+0

@WhozCraig Тот факт, что он пробовал «C: \ scores.txt», - довольно хороший намек на платформу. –

ответ

2

попробовать это:

#include<iostream> 
#include<fstream> 
#include<string> 
using namespace std; 
void getHighScores(int scores[], string names[]); 

int main() 
{ 
    string filename = "scores.txt"; // could come from command line. 
    ifstream fin(filename.c_str()); 
    if (!fin.is_open()) 
    { 
     cout << "Could not open file: " << filename << endl; 
     return 1; 
    } 

    int scores[32]; 
    string names[32]; 

    int iter = 0; 
    while (fin >> names[iter] >> scores[iter]) 
    { 
     if (++iter >= 32) 
     { 
      break; 
     } 
     cout << iter << endl; 
    } 

    if (iter >= 2) 
    { 
     cout << scores[2] << endl; 
    } 

    fin.close(); 

    return 0; 
} 

void getHighScores(int scores[], string names[]) 
{ 

} 
+0

Просто попробовал это. Я просто добавил дорожку, которая объявляет переменную счетчика 'int score [5];' поскольку вы ее забыли. Я получил следующее с вашим кодом: 'Не удалось открыть файл: score.txt Нажмите любую клавишу, чтобы продолжить. , .' – user3116382

+0

Попробуйте поместить «score.txt» в тот же каталог, что и исполняемый файл (у основания проекта). –

+1

Я подтвердил, что приведенный выше код загружает файл (с содержимым, который вы разместили выше) и выполняет точно так, как ожидалось. Файл scores.txt размещался в том же месте, что и исполняемый файл. –

1

при использовании "\", чтобы определить путь использовать два вместо одного C: \ \ scores.txt

-1

Причина она не заключается в следующем:

int scores[32]; 
string names[32]; 
stream>>scores[0]; 
stream>>names[0]; 
if(stream.fail()) 
    cout<<"It failed\n"<<strerror(errno)<<endl; 

По умолчанию оценки [0] и имена [0] не имеют заданного значения и пытаются передать их файлу, что приводит к его сбою. Если вы попытаетесь прокомментировать эти две строки:

stream>>scores[0]; 
stream>>names[0]; 

Вы увидите, что он больше не работает и работает нормально.

+1

Сокращенный. 'score [0]' и 'names [0]' не требуют начального значения перед их записью из потока. Убедитесь, что удаление двух строк не решает проблему. – MooseBoys

1

Я немного пошатнулся. Ваш код на C++ считывает баллы и имена в обратном порядке из вашего входного текста. Первая строка текста во входном файле: Ronaldo, но ваш первый operator>> - score[0] (a int). Это приводит к установке failbit, и поэтому fail() возвращает true. Это также объясняет, почему вы в конечном итоге получаете мусор для элементов массива назначения.

Отмените порядок оценок/имен в файле scores.txt или на вашем синтаксическом коде C++ (но не на обоих!), И вам должно быть хорошо идти.

+0

Спасибо! Это решило мою проблему. – user3116382

+1

Не 'badbit', а' failbit'. –

Смежные вопросы