访问冲突写入位置

时间:2015-04-15 23:28:32

标签: c++ char ifstream getline istream

我是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,',');

2 个答案:

答案 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字节。