10

每次我通过 fstream 阅读时,最后都会多出 1 个字符,我该如何避免这种情况?

编辑:

ifstream readfile(inputFile);
ofstream writefile(outputFile);
char c;
while(!readfile.eof()){
      readfile >> c;
      //c = shiftChar(c, RIGHT, shift);
      writefile << c;
}
readfile.close();
writefile.close();
4

2 回答 2

9

这通常是由于对文件结尾的测试不正确造成的。您通常想要执行以下操作:

while (infile>>variable) ...

或者:

while (std::getline(infile, whatever)) ...

但不是:

while (infile.good()) ...

或者:

while (!infile.eof()) ...

前两个读取,检查是否失败,如果失败则退出循环。后两个尝试读取,处理变量中现在的内容,然后如果前一次尝试失败,则在下一次迭代中退出循环。在最后一次迭代中,读取失败后变量中的内容通常是之前的内容,因此像后两个中的任何一个这样的循环通常会出现两次处理文件中的最后一项。

要轻松地将一个文件复制到另一个文件,请考虑使用以下内容:

// open the files:
ifstream readfile(inputFile);
ofstream writefile(outputFile);

// do the copy:
writefile << readfile.rdbuf();

这适用于小文件,但对于较大的文件可能会大大减慢。在这种情况下,您通常希望使用循环,read从一个文件writeing 到另一个文件。这也有可能出现细微的错误。一种经过测试并且通常运行良好的方法如下所示:

    std::ifstream input(in_filename, std::ios::binary);
    std::ofstream output(out_filename, std::ios::binary);

    const size_t buffer_size = 512 * 1024;
    char buffer[buffer_size];

    std::size_t read_size;
    while (input.read(buffer, buffer_size), (read_size = input.gcount()) > 0)
        output.write(buffer, input.gcount());
于 2010-05-06T19:27:17.293 回答
0

根据代码,您似乎正在尝试将一个文件的内容复制到另一个文件?

如果是这样,我会尝试这样的事情:

ifstream fin(inputFile, ios::binary);

fin.seekg(0, ios::end);
long fileSize = fin.tellg();
fin.seekg(0, ios::beg);

char *pBuff = new char[fileSize];
fin.read(pBuff, fileSize);
fin.close();

ofstream fout(outputFile, ios::binary)
fout.write(pBuff, fileSize);
fout.close;
delete [] pBuff;
于 2010-05-06T19:42:19.623 回答