用C ++打开多个文件

时间:2010-03-05 16:09:50

标签: c++

我有这个代码在命令行一次打开多个文件,然后如果它无法打开其中一个文件,它会关闭所有文件并退出。

/* 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的含义是什么?感谢。

4 个答案:

答案 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:

删除数组后,你再次开始尝试再次打开文件 - 如果任何打开的调用失败,你将永远被打入循环。 删除数组后,您需要returnbreak