簡體   English   中英

使用“ ifstream”時出現分段錯誤

[英]Segmentation fault while using “ifstream”

我正在嘗試在文件中獲取一部分文本。 我使用了“ 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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM