EOF 循环在最终结束之前重复行 3 次

EOF loop repeats lines 3 times before finally ending

提问人:Holden Tatlow 提问时间:2/26/2018 更新时间:2/26/2018 访问量:60

问:

我有一个作业,给我一个文件,其中包含编号格式的日期,我必须让一个程序读取该文件,并为每个日期吐出一周中的几天。文件的每一行都是一个单独的日期。我的首选方法是 eof 循环。但是,我的文件有 10 个日期,我的输出有 30 个。这是我的主要背景。

int main()
{
    ifstream inFile;
    inFile.open("/Users/holdentatlow/Desktop/date 2");

    const char *Names[] = {"Sunday","Monday", "Tuesday","Wednesday", "Thursday", "Friday", "Saturday"};

    int day = 0;

    int date;

    inFile >> date;
    cout << "Day : " << Names[day] << endl;

    while (!inFile.eof()){

        inFile >> date;
        day = getWeekDay(date, date, date);
        cout<< "Day : "<< Names[day] <<endl;

    }

    inFile.close();

    return 0;
}

此外,我的印象是它报告的日期并不完全准确。我没有决心单独检查每一个,但结果似乎不稳定,不能简单地重复。

这是我从中获取日期的文件

0 10  1900
2 16 1900
1 2 1944
0 1 2004
1 29 2004
11 24 2002
6 2 2050
2 23 2004
0 6 1812
1 3 1800
C++ 数组 while 循环 eof

评论

4赞 Lightness Races in Orbit 2/26/2018
“我的首选方法是 eof 循环”为什么?谁教你这样做的?
1赞 melpomene 2/26/2018
day = getWeekDay(date, date, date);什么。
1赞 2/26/2018
首选构造函数和析构函数,而不是 和 。.open().close()
3赞 Lightness Races in Orbit 2/26/2018
不,它不起作用这就是问题所在。为什么你认为它有效,而不是问题,当你得到的输出是你预期的三倍,而且它们“不完全准确”?在我看来,这是一个了不起的信仰飞跃。
1赞 Lightness Races in Orbit 2/26/2018
前 10 个输出不可能准确,除非由于缺乏错误检查而纯粹是偶然的。如果你觉得你开始受到“敌意”,也许在沮丧的背景下更多地解释它,据称你要求澄清你做错了什么,但随后拒绝了每个人对这个问题的回答。如果你开始听我们的话,放下防御态度,我们可以一起解决这个问题。还要记住,这是免费的,而且是周日晚上。

答:

4赞 Lightness Races in Orbit 2/26/2018 #1

你似乎试图同时使用三件事。date

int date;
inFile >> date;

在这里你读到一个数字。一。不是三个;.

while (!inFile.eof()){

在这里,你犯了一个大罪;这不是循环输入的方法

inFile >> date;
day = getWeekDay(date, date, date);

在这里,你读另一个数字,并将其传递给三次。getWeekDay

你的循环一直持续到没有更多的数字可以读取(某种程度上:参见上面关于该用法的注释),在你的情况下,这将花费你预期的三倍的时间(即 30 而不是 10),因为你读取的数字是你想象的三分之一(再次,见上文)。eof

您需要对要读取的每个数字进行操作。>>

下面是程序的改进版本:

#include <fstream>
#include <istream>
#include <iostream>

// Assumed defined elsewhere
int getWeekDay(int date, int month, int year);

int main()
{
    std::ifstream inFile("/Users/holdentatlow/Desktop/date 2");

    static const char* Names[] = {
       "Sunday",
       "Monday",
       "Tuesday",
       "Wednesday",
       "Thursday",
       "Friday",
       "Saturday"
    };

    int date, month, year;
    while (inFile >> date >> month >> year) {
       const int day = getWeekDay(date, month, year);
       std::cout << "Day : " << Names[day] << std::endl;
    }
}