在for循环中崩溃

时间:2012-05-06 22:14:44

标签: 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; 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;
    }

我出错的任何想法?

3 个答案:

答案 0 :(得分:3)

fileName是一个包含30个未初始化指针的数组。 *fileNamefilename[0]相同,std::string是指向char的未初始化指针。您不能将此指针用于任何内容,只需为其指定有效值即可。但是,你并没有这样做,而是你正试图读取数据,并带来可预见的灾难性后果。

简而言之,您根本不应该在C ++中使用任何指针,而是根据您的情况使用std::string fileName; if (!(std::cin >> fileName)) { /* I/O error, die */ } // ...

fileName

(也许你打算做的是让char fileName[30];成为一个包含30个字符的数组:{{1}}。但是不要这样做。即使它可能有用,也很糟糕。)

答案 1 :(得分:2)

这里还有一点点狡猾:

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存储您的字符串和输入,如果它不需要new内存在主writeFile函数的范围之外不需要。字符串支持动态调整大小,因此您无需将其初始化为任何大小,这是我用Google搜索的第一个示例,以帮助您understand

答案 2 :(得分:1)

为什么使用“C way”存储文件名?而你正在以错误的方式使用它:char **。宣布:

会更容易
std::string fileName;
while(!std::cin >> fileName);
ofstream myfile(fileName.c_str());

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