使用"ifstream"时出现分段错误

Segmentation fault while using "ifstream"

本文关键字:分段 错误 ifstream 使用      更新时间:2023-10-16

我试图在文件中获得文本的一部分。我使用了"ifstream":

#include <fstream>
void func(){
    char *myString;
    ifstream infile;
    infile.open("/proc/cpuinfo");
    while (infile >> myString){
        if  (!strcmp(myString,"MHz"))
        break;
    }
}

,我得到一个"分割错误"。有人知道为什么吗?

您没有为myString分配内存。使用std::string。或者最好使用其他语言,如python、perl或unix utils,如grep、awk、sed。

因为目标值应该是:

std::string myString;

而不是char*。可以使用char*,但是您必须确保它首先指向足够大的东西。(在您的例子中,它没有指向您忘记初始化它的任何地方。)并定义"足够大";是很重要的,因为你不知道下一个单词的大小,直到你读了它。

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

infile >> myString

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

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

但同样的解决方案是将其完全替换为std::string

因为您没有为myString分配内存。这个问题的快速解决方案是使用std::string而不是c风格的char*字符串,它可以进行内存管理,因此您不必。

出现错误的原因如下:

当你声明char *myString时,你是在创建一个指向字符的指针。然而,你没有初始化这个指针指向任何东西,所以它可以指向内存中的任何地方。当你做infile >> myString时,你要在内存中一个未指定的位置写一堆字符。这个位置恰好是程序的重要部分,导致程序崩溃。

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;
}