1

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

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

4

3 回答 3

3

fileName是一个包含 30 个未初始化的 char 指针的数组。*fileName与 相同filename[0],它是指向 char 的未初始化指针。除了为它分配一个有效值之外,您不能将此指针用于任何事情。但是,您并没有这样做,而是尝试向其读取数据,这会带来可预见的灾难性后果。

简而言之,您根本不应该在 C++ 中使用任何指针,而应使用 anstd::string来满足您的情况:

std::string fileName;
if (!(std::cin >> fileName)) { /* I/O error, die */ }
// ...

(也许你的意思是制作fileName一个包含 30 个字符的数组:char fileName[30];。但不要那样做。即使它可能有效,但它非常糟糕。)

于 2012-05-06T22:20:14.097 回答
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 *从 a 中读取cinstd::string用于存储您的字符串和输入,如果在 main函数new范围之外不需要内存,则不需要内存。writeFile字符串也支持动态调整大小,因此您无需将其初始化为任何大小,这是我搜索的第一个示例以帮助您理解

于 2012-05-06T22:21:26.123 回答
1

你为什么使用“C方式”来存储你的文件名?而且您以错误的方式使用它:char**。声明会更容易:

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

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

于 2012-05-06T22:25:15.207 回答