C++ 在for循环中崩溃
我正试图写入一个文本文件。当我不使用for循环时,我可以写得很好,但是当我实现它将所有数组写入文件时,它崩溃了。这是我的密码:C++ 在for循环中崩溃,c++,loops,for-loop,C++,Loops,For Loop,我正试图写入一个文本文件。当我不使用for循环时,我可以写得很好,但是当我实现它将所有数组写入文件时,它崩溃了。这是我的密码: void writeFile(void) { char *fileName[30]; cout << "enter a filename"; cin >> *fileName; ofstream myfile; myfile.open (*fileName); int p; for(p = 0; p <= i;
void writeFile(void)
{
char *fileName[30];
cout << "enter a filename";
cin >> *fileName;
ofstream myfile;
myfile.open (*fileName);
int p;
for(p = 0; p <= i; p++)
{
myfile << right << setw(4) << setfill('0') << packet[i].getSource() << ":";
myfile << right << setw(4) << setfill('0') << packet[i].getDest() << ":";
myfile << right << setw(4) << setfill('0') << packet[i].getType() << ":";
myfile << right << setw(4) << setfill('0') << packet[i].getPort() << endl;
}
void writeFile(void)
{
字符*文件名[30];
cout>*文件名;
流文件;
myfile.open(*文件名);
INTP;
for(p=0;pfileName
是一个包含30个指向char的未初始化指针的数组。*fileName
与fileName[0]相同
,这是指向字符的未初始化指针。您只能将此指针用于指定有效值。但您并没有这样做,而是试图向其读取数据,这将带来可预见的灾难性后果
简而言之,你不应该在C++中使用任何指针,而是使用<代码> STD::String 你的情况:
std::string fileName;
if (!(std::cin >> fileName)) { /* I/O error, die */ }
// ...
(也许你想做的是将fileName
制作成一个包含30个字符的数组:char fileName[30];
。但是不要这样做。即使它可以工作,也非常糟糕。)fileName
是一个包含30个未初始化的字符指针的数组。*fileName
与fileName[0]相同
,这是指向字符的未初始化指针。您只能将此指针用于指定有效值。但您并没有这样做,而是试图向其读取数据,这将带来可预见的灾难性后果
简而言之,你不应该在C++中使用任何指针,而是使用<代码> STD::String 你的情况:
std::string fileName;
if (!(std::cin >> fileName)) { /* I/O error, die */ }
// ...
(也许你想做的是把fileName
做成一个包含30个字符的数组:char fileName[30];
。但是不要这样做。尽管它可能会工作,但这是非常糟糕的。)这里还有一件事有些棘手:
for(p = 0; p <= i; p++)
这是Moo和Koenig推荐的表格:
我也不会使用char*
来读取cin
,使用std::string
来存储字符串和输入,如果在主writeFile
函数的作用域之外不需要内存,则不需要new
内存。字符串也支持动态调整大小,因此不需要将其初始化为任何值大小,这是我在谷歌上搜索的第一个帮助您的示例这里还有一个稍微有点可疑的地方:
for(p = 0; p <= i; p++)
这是Moo和Koenig推荐的表格:
我也不会使用char*
来读取cin
,使用std::string
来存储字符串和输入,如果在主writeFile
函数的作用域之外不需要内存,则不需要new
内存。字符串也支持动态调整大小,因此不需要将其初始化为任何值大小,这是我在谷歌上搜索的第一个示例,它帮助您为什么要使用“C方式”来存储文件名?而您使用的方式是错误的:char**。声明:
std::string fileName;
while(!std::cin >> fileName);
ofstream myfile(fileName.c_str());
你也在循环中使用i,但在p上迭代,我想这不是你想要做的…为什么你用“C方式”来存储文件名?你用错了方式:char**。声明:
std::string fileName;
while(!std::cin >> fileName);
ofstream myfile(fileName.c_str());
你也在循环中使用i,但在p上迭代,我想这不是你想要做的…我是什么?它似乎没有在任何地方定义。当你引用packet[i]
时,你可能是指packet[p]
是的,这就是我的意思,鲍勃,谢谢你的提醒,还是不应该让它崩溃?对不起,我是全局的,初始化为0。char*fileName[30];
是双指针。为什么?@Tibor:不,那不是双指针。这是一个指针数组。当然,它的用法有问题,std::string fileName;if(!std::getline)(std::cin,fileName))throw std::runtime_error(“Read failed”);
更可取(不一定要抛出异常,但应该注意潜在的错误并相应地处理这种情况)。我是什么?它似乎在任何地方都没有定义。当您引用数据包[i]时,它看起来像
你可能指的是数据包[p]
是的,我就是这个意思,鲍勃,谢谢你提醒,还是不应该让它崩溃?对不起,我是全局的,初始化为0。char*fileName[30]
是双指针。为什么?@Tibor:不,那不是双指针。它是指针数组。当然,它的使用是有问题的,std::string fileName;如果(!std::getline(std::cin,fileName))抛出std::runtime_错误(“读取失败”);
会更好(不必抛出异常,但应注意潜在的错误并相应地处理情况).1对于经典的“没有为字符串添加任何空格,但无论如何都要将其删除”感谢您的回答!我已更改为字符串并删除了指针,但我收到了一个错误:错误:调用“std::basic_of stream::open(std::string&)时没有匹配的函数在旧C++中,没有一个从<代码>字符串 > <代码> >流> <代码>的构造函数。这已经被C++ 11固定,但是同时,也说“代码> STD::OFFROW F(文件名,CXString))
。很抱歉给您带来不便。+1对于经典的“没有为字符串添加任何空间,但无论如何都将其固定”感谢您的回答!我已更改为字符串并删除了指针,但我收到一个错误:错误:调用“std::basic_of stream::open(std::string&)”时没有匹配的函数在旧C++中,没有一个从<代码>字符串< /代码>中的<代码>流>代码>。这已经被C++ 11固定,但同时,也说“代码> STD::OFFROW F(文件名,CXString));< /代码>。