我正在尝试写入文本文件。当我不使用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;
}
我出错的任何想法?
答案 0 :(得分:3)
fileName
是一个包含30个未初始化指针的数组。 *fileName
与filename[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,我认为这不是你想要做的......