在 for 循环中崩溃

Crashing in a for loop

本文关键字:崩溃 循环 for      更新时间:2023-10-16

我正在尝试写入文本文件。当我不使用 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; 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;
    }

有什么想法我哪里出错了吗?

>fileName是一个由 30 个未初始化的 char 指针组成的数组。 *fileNamefilename[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++)

你可能想要

for(p = 0; p < i; p++)

这样您就不会尝试取消对数组末尾的引用

可能写得更好

for (int p = 0; p != i; ++p)

根据Moo和Koenig,这是推荐的形式:http://www.drdobbs.com/cpp/184402072

我也不会使用 char *cin读取,使用 std::string 来存储您的字符串和输入,如果在主 writeFile 函数范围之外不需要内存,则无需new内存。字符串也支持动态调整大小,因此您无需将其初始化为任何大小,这是我用谷歌搜索的第一个示例来帮助您理解

为什么要使用"C 方式"来存储文件名?而且你用错了方式:字符**。只需声明以下内容会更容易:

std::string fileName;
while(!std::cin >> fileName);
ofstream myfile(fileName.c_str());

您还在循环中使用 i,但正在迭代 p,我认为这不是您想要做的......