Ошибка сегментации при использовании «ifstream» - PullRequest
1 голос
/ 29 декабря 2011

Я пытаюсь получить часть текста в файле.Я использовал «ifstream»:

#include <fstream>

void func(){
    char *myString;

    ifstream infile;
    infile.open("/proc/cpuinfo");

    while (infile >> myString){
        if  (!strcmp(myString,"MHz"))
        break;
    }
}

и получаю «Ошибка сегментации».кто-нибудь знает почему?

Ответы [ 5 ]

7 голосов
/ 29 декабря 2011

Вы не выделили память для myString.Используйте std::string.Или лучше любой другой язык, утилиты Python, Perl или Unix, такие как grep, awk, sed.

2 голосов
/ 29 декабря 2011

Поскольку целевое значение должно быть:

std::string myString;

, а не char*. Можно использовать char*, но вы должны убедиться, что он сначала указывает на что-то достаточно большое. (В вашем случае это никуда не указывает - вы забыли инициализировать его.) И определяя & ldquo; достаточно большой & rdquo; нетривиально, учитывая, что вы не знаете размер следующего слова, пока не прочитаете его.

1 голос
/ 29 декабря 2011

Знаете, есть причина, по которой в C ++ есть строковый класс. Это потому, что использование указателей на символы трудоемко и подвержено ошибкам.

infile >> myString

будет считывать из файла *, куда myString указывает. И это неинициализированный указатель, он указывает на какой-то случайный адрес мусора.

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

Но разумное решение - полностью заменить его на std::string.

0 голосов
/ 29 декабря 2011

char myString[256] тоже хорошо компилируется.

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


 void func()
 {
    char myString[256] ;

    ifstream infile;
    infile.open("/proc/cpuinfo");

    while ( ! infile.eof() )
    {
          infile >> myString;
          cout<<myString<<" \n"; 

        if  (! strcmp(myString,"MHz") )
        {
            infile.close();
            break;
        }
    }
     infile.close();
     cout<<" \n";  
}

int main()
{

    func();
    return 0;
}
0 голосов
/ 29 декабря 2011

Поскольку вы не выделили память для myString.Быстрое решение этой проблемы - использовать std::string вместо строк в стиле C char*, что делает управление памятью таким образом, что вам не нужно.

Вот почему возникает ваша ошибка:

Когда вы объявляете char *myString, вы создаете указатель на символ.Однако вы не инициализируете этот указатель ни к чему, так что он может указывать абсолютно в любом месте памяти.Когда вы делаете infile >> myString, вы собираетесь написать группу символов в неопределенном месте в памяти.Просто так получилось, что это место было важной частью вашей программы, что привело к ее аварийному завершению.

...