0

我从文件中读取数字,应用 3 个函数并打印到另一个文件:

int main(int argc, char** argv) {
    std::ifstream fin;
    fin.open("input.txt");

    std::ofstream fout;
    fout.open("output.txt", std::ios::app);

    char arr[50];
    int a,b;
    int N;//number to factor

    while (!fin.eof()){
        //Print backward
        fin >> arr;
        PrintBackward( arr );
        fout << endl;

        //Greatest common divisor
        ((fin >> a) >> b);
        fout << gcd( a, b );
        fout << endl;

        //Find prime factor
        fin >> N;
        PrimeFactor(N);
        fout << endl;     
    }

    fin.close();
    fout.close();

    return 0;
}

运行后,结果重复:

olleh
3
2 3 7 
olleh
3
2 3 7

我读了一篇类似的文章,但它是关于读入 1 个变量,所以这似乎不可行。

如果我break在循环结束时设置 a while,那很好。有什么办法不使用break吗?

4

2 回答 2

3

while (!whatever.eof())本质上总是错误的,并且永远不会正确检测到文件的结尾。在您的情况下,将读取合并在一起是最简单的,然后进行所有处理,如下所示:

while (fin >> arr >> a >> b >> N) {
    PrintBackwards(arr);
    fout << "\n";

    fout << gcd(a, b) << "\n";

    fout << PrimeFactor(N) << "\n";
}

关键部分是检查读取的结果,而不是相互分开检查和读取。

还有一些建议:我会使用 anstd::string而不是数组。我还将反转字符串与打印它分开,所以你可以有类似的东西:

fout << reverse(arr)   << "\n" 
     << gcd(a, b)      << "\n" 
     << PrimeFactor(N) << "\n";

强调操作之间的共性往往是一件好事。

编辑:只是为了好玩,如果你愿意,我会指出另一种你可以做事的方式。由于您基本上是作为一个组来阅读和处理这四个项目,因此您可以使该分组更加明确:

struct item { 
     std::string arr;
     int a, b, N;

     friend std::istream &operator>>(std::istream &is, item &i) { 
         return is >> arr >> a >> b >> N;
     }
};

struct process {
    std::string operator()(item const &i) { 
        std::ostringstream buffer;

        buffer << reverse(arr) << "\n" << gcd(a, b) << "\n" << PrimeFactor(N);
        return buffer.str();
    }
}

有了这个,你可以让标准库处理读写、检查文件结尾等所有细节:

std::transform(std::istream_iterator<item>(fin), 
               std::istream_iterator<item>(),
               std::ostream_iterator<std::string>(std::cout, "\n"),
               process());
于 2011-04-16T04:54:15.977 回答
0

我的猜测是您过早地检查 eof - 它仅在您尝试读取并且读取失败时设置,因为您位于文件末尾。尝试在之后添加fin >> arr

if (fin.eof()) break;

实际上,您应该在每次 IO 操作后检查错误 - 不这样做是草率的编码并且不会健壮。

于 2011-04-16T04:51:04.853 回答