我是c ++的新手,我不知道这个错误意味着什么。它从文件读取并尝试将值存储在char * []。
中该文件包含:
5,Justin,19,123-45-6789,State Farm,9876,Jessica,Broken Hand,
这是我的代码。
void Hospital::readRecordsFile(){
std::ifstream fileStream;
fileStream.open(fileName); // Opens the file stream to read fileName
char * temp [8];
int i = 0;
while(!fileStream.eof()){
fileStream.get(temp[i],256,',');
i++;
}
i = 0;
for(char * t:temp){
std::cout << t << std::endl;
}
}
错误位于第fileStream.get(temp[i],256,',');
行
答案 0 :(得分:2)
你定义了一个包含8个指向char的指针的数组,但忘记分配内存,以便指针指向一个有效的内存块:
char * temp [8]; // need then to allocate memory for the pointers
因此,在行
fileStream.get(temp[i],256,',')
你最终使用的不是你的内存。
解决方案:
for(int i = 0; i<8; i++)
temp[i] = new char[256]; // we allocate 256 bytes for each pointer
但更好的是,改为使用std::vector<std::string>
。
在您现在的代码中,您似乎隐含地假设该文件不超过8行,我很难相信。如果你的文件超过8行,那么你最终将访问超出界限的8个指针数组,因此你将获得另一个未定义的行为(通常是段错误)。这就是为什么使用像std::vector
这样的标准STL容器要好得多,以避免所有这些麻烦。
如果你必须使用指针并想要一个可变数量的行,那么你必须使用一个指向指针的指针,
char** temp;
然后为足够多的指针指定内存,
temp = new char* [1000]; // we believe we won't have more than 1000 lines
然后,对于每个指向char的指针,分配内存
for(int i = 0; i < 1000; ++i)
temp[i] = new char[256];
在程序结束时,您必须以相反的顺序delete[]
for(int i = 0; i < 1000; ++i)
delete[] temp[i];
delete[] temp;
正如你所看到的,它变得越来越混乱。
答案 1 :(得分:0)
您从未为temp
中的每个指针分配内存
你可能想要这样的东西:
for (unsigned int i = 0u; i < 8; ++i)
{
temp[i] = new char[256];
}
表示temp
变量指向8个动态分配的字节缓冲区,每个缓冲区为256字节。