我正在试着写一个文本文件。当我不使用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;
}
你知道我哪里错了吗?
发布于 2012-05-06 22:20:14
fileName
是一个由30个未初始化的字符指针组成的数组。*fileName
与filename[0]
相同,后者是指向字符的未初始化指针。您不能将此指针用于任何操作,只能为其赋值。然而,您并没有这样做,相反,您正在尝试将数据读取到其中,这将带来可预见的灾难性后果。
简而言之,你根本不应该在C++中使用任何指针,而是根据自己的情况使用std::string
:
std::string fileName;
if (!(std::cin >> fileName)) { /* I/O error, die */ }
// ...
(也许您想要做的是使fileName
成为一个由30个字符组成的数组:char fileName[30];
。但不要这么做。即使它可能会起作用,但它也非常糟糕。)
发布于 2012-05-06 22:21:26
还有一件事有点不对劲:
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
操作。字符串还支持动态调整大小,因此您不需要将其初始化为任何大小,这里是我搜索的第一个示例,以帮助您understand
发布于 2012-05-06 22:25:15
为什么你要用"C方式“来存储你的文件名?你用错了方式: char**。更简单的方法是声明:
std::string fileName;
while(!std::cin >> fileName);
ofstream myfile(fileName.c_str());
你也在你的循环中使用了i,但是在p上迭代,我认为这不是你想要做的…
https://stackoverflow.com/questions/10474741
复制相似问题