2012-05-31 2 views
0

Программа должна запрашивать у пользователя свое имя пользователя. Получив имя пользователя, он объединяет его с '.history' для создания username.history. Затем он открывает этот файл (имя_пользователя.история) и читает ввод от него. Хотя я нахожусь в segfault. Всякий раз, когда он открывает файл, который пуст, потому что файл не существует, он считывает несколько строк и затем выдает segfault. Я думаю, проблема может быть связана с тем, как я пытаюсь открыть файл, но я не уверен. Вот та часть, которая вызывает проблемы:Segfault во время чтения файла

// File input and output 
ifstream f_in; 
ofstream f_out; 

// Prompt user for their username. 
char username[80]; 
cout << "Please input your username: " << endl; 
cin >> username; 
cout << endl; 
cout << "Loading history file if it exists." << endl; 

// Create file naem and initialize the file line counter to 0. 
strcat(username, ".history"); 
int fcount = 0; 

// Open file and read in lines if there are any. 
// Place read lines into the command string for use later. 
char tmp[50]; 

f_in.open(username); 
while(!f_in.eof()){ 
    f_in >> tmp; 
    cmd[fcount] = tmp; 
    fcount++; 
} 
f_in.close(); 

Другое уместна информация: CMD объявлена ​​как глобальная переменная (символьные CMD [200] [50])

Любая помощь будет значительно appreaciated.

+0

Есть ли каждая строка из "username.history" менее 50 символов? – Falmarri

+0

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

+3

Почему вы используете 'strcat' (считающийся небезопасным программистами C) в программе на C++? Использовать 'std :: string' и жизнь вдруг станет намного проще. –

ответ

2

Не уверен, что это единственная проблема, но cmd[fcount] = tmp является неправильным. Вы должны использовать strcpy().

0
 
while(f_in.good()) 
{ 
    f_in >> tmp; 
    cmd[fcount] = tmp; 
    fcount++; 
} 
+2

См. Мой комментарий к вопросу, этот цикл пытается добавить значение _unsuccessfully-read_ после того, как eof достигнут массива. – Shahbaz