我有这个代码在命令行一次打开多个文件,然后如果它无法打开其中一个文件,它会关闭所有文件并退出。
/* Opens an array of files and returns a pointer to the first
* element (the first file).
*/
ifstream *OpenFiles(char * const fileNames[], size_t count)
{
/* If no command line arguments, error and exit */
if (count == 0) {
cerr << "Invalid number of arguments.";
exit(EXIT_FAILURE);
}
ifstream *fileObj;
fileObj = new ifstream[count];
if (fileObj == NULL) {
cerr << "Failed to create space for files";
exit(EXIT_FAILURE);
}
/* Opens one file at a time and closes all files if there is an
* error opening any file.
*/
for (int loopCount = 0; loopCount < (int)count; loopCount++) {
fileObj[loopCount].open(fileNames[loopCount], ios::out);
if (!fileObj[loopCount].is_open()) {
cerr << "Failed to open " << fileNames[loopCount] << "\n";
for (; loopCount >= 0; loopCount--) {
fileObj[loopCount].close();
cout << "Closed " << fileNames[loopCount] << "\n";
}
delete[] fileObj;
}
}
return fileObj;
}
我这样做是为了完成家庭作业而我的老师有另一个检查员,我们必须提交给我并给我这些类型的警告:
Assign8_1.cpp(44): error 445: (Warning -- Reuse of for loop variable 'loopCount' at 'line 40' could cause chaos)
return fileObj;
Assign8_1.cpp(51): error 850: (Info -- for loop index variable 'loopCount' whose type category is 'integral' is modified in body of the for loop that began at 'line 40')
return fileObj;
Assign8_1.cpp(51): error 449: (Warning -- Pointer variable 'fileObj' previously deallocated [Reference: file Assign8_1.cpp: lines 30, 48])
Assign8_1.cpp(30): error 831: (Info -- Reference cited in prior message)
Assign8_1.cpp(48): error 831: (Info -- Reference cited in prior message)
}
Assign8_1.cpp(63): error 818: (Info -- Pointer parameter 'files' (line 55) could be declared as pointing to const)
}
从第一个警告开始,我想知道为什么我不应该像在代码中那样使用我的loopCount变量。这就是我认为它会起作用的方式,跟踪我正在查看哪个文件,打开并正确关闭它。
有谁知道错误449的含义是什么?感谢。
答案 0 :(得分:4)
在循环中exit(EXIT_FAILURE)
后需要delete[] fileObj
,否则你只会在下一次迭代时崩溃。这可能是449告诉你的警告。
除此之外,代码看起来很好。但是,如果您希望在没有这些警告的情况下进行编译,则可以将内部循环转换为仅使用loopCount
作为边界的标准for循环。类似的东西:
for (int i = loopCount; i >= 0; i--) {
fileObj[i].close();
cout << "Closed " << fileNames[i] << "\n";
}
答案 1 :(得分:2)
你绝对可以使用你的loopCount变量,但它会导致你的错误。粗略地看一眼,看起来它会永远运行,因为你永远不会从内环中突破外环。您在内循环中递减loopCount,并在外循环中来回递增,来回递增。
虽然在内循环中使用loopCounter并不违反语言,但它通常表明正在发生的事情不是你真正想要的。
最好使用这样的代码:
list<ifstream> files;
ifstream file("name");
if ( file.is_open() ) {
files.push_back(file);
}
// close files
for ( list<ifstream>::iterator i = files.begin(); iter++; i != files.end() ) {
i->close();
}
答案 2 :(得分:1)
我的代码结构更像这样:
for all input names
if (!open file)
break;
if (number of open files != number of input names)
close the files that did open
return (possibly empty) list of files
答案 3 :(得分:0)
449:
删除数组后,你再次开始尝试再次打开文件 - 如果任何打开的调用失败,你将永远被打入循环。
删除数组后,您需要return
或break
。