[英]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.