我正在尝试在文件中获取部分文本。 我使用了“ifstream”:
#include <fstream>
void func(){
char *myString;
ifstream infile;
infile.open("/proc/cpuinfo");
while (infile >> myString){
if (!strcmp(myString,"MHz"))
break;
}
}
我得到了“分段错误”。有谁知道为什么?
答案 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;
}