Ядро сбрасывается при записи в файл? - PullRequest
0 голосов
/ 03 февраля 2012

Привет, это очень простой кусок кода, который я только что написал для практики ввода-вывода файлов C ++.Но я получил исключение Segmentation Fault (core dumped), когда я запускаю это.Вот мой код ниже:

# include <iostream>
# include <string>
# include <cmath>
# include <fstream>
using namespace std;

int main()
{
double num, rad, i, angle, x, y;
char * filename;
ofstream file;
// prompt  ask for number
cout << "Enter the number of sample points: ";
cin >> num;

// prompt for circle radius.
cout << "Enter the circle radius: ";
cin >> rad;

// prompt for output file name.
cout << "Enter the output filename: ";
cin >> filename;

file.open (filename, fstream :: in | fstream :: trunc);
if(!file.is_open())
{
    cout << "Error opening file " << filename << endl;
    cout << "Exiting..." << endl;
    return 0;
}
for(i = 1; i <= num; i ++)
{
    //angle = 2 * M_PI * (i/num);
    //x = rad * cos(angle);
    //y = rad * sin(angle);
    //file << "\t" << x << "\t" << y << endl;
    file << "this is " << i << endl;
}
cout << "finished";
file.close();
return 0;
}

Я не уверен, где проблема, но после ввода имени выходного файла появляется сообщение об ошибке «ошибка сегмента (сброшено ядро)».

Спасибо

Ответы [ 2 ]

2 голосов
/ 03 февраля 2012

cin >> filename будет неопределенным поведением, поскольку filename является неинициализированным указателем.

Если вы хотите хранить символы, вам нужно выделить для них место. Так что вы могли бы сделать:

char filename[150] = {0};
cin >> filename; // OK, you provide space for 149 characters. Will still break
                 // if more characters are provided by the user.

или

#include <string>
std::string filename; // overloads operators >> and << with streams
                      // automatically performs memory management
// std::cin >> filename; /* Would stop at first space */
std::getline(std::cin, filename); // better: will stop at any carriage return
1 голос
/ 03 февраля 2012

Просьба выделить немного памяти для имени файла, используя только ponter.Внести изменения

char  filename[50];
...