2011-12-29 3 views
1

Я пытаюсь получить часть текста в файле. я использовал "ifstream":Ошибка сегментации при использовании «ifstream»

#include <fstream> 

void func(){ 
    char *myString; 

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

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

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

ответ

7

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

2

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

std::string myString; 

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

0

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

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

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

1

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

infile >> myString 

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

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

Но разумное решение состоит в том, чтобы полностью заменить его на std::string.

0

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

Прохладный, я рад, но это тоже не сработает. – kan

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