使用“ifstream”时出现分段错误

时间:2011-12-29 09:53:16

标签: c++ segmentation-fault ifstream

我正在尝试在文件中获取部分文本。 我使用了“ifstream”:

#include <fstream>

void func(){
    char *myString;

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

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

我得到了“分段错误”。有谁知道为什么?

5 个答案:

答案 0 :(得分:7)

您尚未为myString分配内存。使用std::string。或者更好的任何其他语言,python,perl或unix utils,如grep,awk,sed。

答案 1 :(得分:2)

因为目标值应为:

std::string myString;

而不是char*。可以使用char*,但你必须确保它首先指向足够大的东西。 (在你的情况下,它不指向任何地方 - 你忘了初始化它。)并且定义“足够大”是非平凡的,因为在你阅读它之前你不知道下一个单词的大小。

答案 2 :(得分:1)

你知道,C ++有一个字符串类是有原因的。这是因为使用char指针很麻烦且容易出错。

infile >> myString

将从myString指向的文件中读取*。它是一个未初始化的指针,它指向一些随机的垃圾地址。

如果您绝对想要使用字符串指针而不是字符串,则必须分配一个可以读取数据的缓冲区。

但理智的解决方案是完全用std::string替换它。

答案 3 :(得分:0)

因为您没有为myString分配内存。对此的快速解决方案是使用std::string而不是C风格的char*字符串,这些字符串执行内存管理,因此您不必这样做。

这就是您的错误发生的原因:

当您声明char *myString时,您正在创建指向角色的指针。但是,您不会将此指针初始化为任何内容,因此它可以指向内存中的任何位置。执行infile >> myString时,您将在内存中未指定的位置写入一堆字符。事实上,这个位置是你的程序的一个重要部分,导致它崩溃。

答案 4 :(得分: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;
}