奇怪的EOF行为C ++ / VIM与其他IDE相比

时间:2015-05-01 06:01:53

标签: c++ vim eof

我目前在使用我的程序正确设置EOF位时遇到问题。 该程序的要求表明我将有两个文件都有整数排序列表。程序应从两个文件中获取一个数字,然后比较这些数字。如果一个小于另一个,则较小的一个将被输出到另一个文件中,然后将从其获得其原始编号的文件中抽取另一个数字。

因此,例如,假设我们有文件1,整数1 3 5 9,整数之间用新行代替空格,文件2用2 4 6 10. 1应该比较为2然后应该将1绘制到输出文件中。然后将用数字3代替1。

为了帮助我解决这个问题,我研究了EOF标志在尝试在最后一个数字被绘制后再次绘制数字后设置。这在我下面的代码中完美地用于通过VIM创建的输入文件。在文件1中的最后一个数字被引入输出文件后,EOF位被设置,然后程序将从第二个文件中引入所有数字。

但是,如果我在任何IDE或文本编辑器中使用相同数量的新闻空间来编写相同的输入文件,我会看到一些奇怪的EOF行为。当我在Sublime Text2或Text Edit中写入相同的文件时,在绘制最后一个数字时,EOF位会被设置为正确。所以我们假设我们使用命令inputFile2>> number2,当此命令绘制最终数字10时,EOF将设置为1。在通过VIM创建的文本文件中,如果我们使用命令inputFile2>> number2,最后一个数字被绘制为10,EOF将不会设置为1,直到我运行命令inputFile2>>数字2。

有没有人知道为什么两位编辑之间会有差异?我已经提供了以下代码。有没有人知道可能出了什么问题?谢谢你的帮助。

std::ifstream inputFile;
std::ifstream inputFile2;
std::ofstream outputFile;
bool conditionMet = false;

/* string variables for user input for files */
std::string inputName;
std::string inputName2;
std::string outputName;

/* int variables to hold the input from file */

int number1,
    number2;


inputFile.open("num1.txt");
inputFile2.open("num2.txt");
outputFile.open("output.txt);

inputFile >> number1;
inputFile2 >> number2;

/* loop until all of the numbers from files are in */
while (conditionMet == false)
{

    /* if the first number is less than or equal to the second number */
    /* check if the input file for number one is at the end of file */
    if (number1 <= number2)
    {

        /* if the end of file has been reached for the input file 1 */
        if (inputFile.eof())
        {
            /* put all of the numbers from input file 2 until the end of file for the second file */
            while (!inputFile2.eof())
            {

                outputFile << number2 << '\n';
                inputFile2 >> number2;
            }

            /* end the loop */

            conditionMet = true;

        }

        /* if the end of the file has not been reached then output number from input file 1 and then take in a new number */
        else if (!inputFile.eof())
        {
            std::cout << inputFile.eof() << "file1 eof before" << number1 << std::endl;
            outputFile << number1 << '\n';

            inputFile >> number1;
            std::cout << inputFile.eof() << "file1 eof after" << number1 << std::endl;
        }
    }

    /* if the first number is greater than the second number */

    else if (number1 > number2)
    {

        /* check if the input file for number two is at the end of file */
        /* if the end of file has been reached for the input file 2 */
        if (inputFile2.eof())
        {
            /* put all of the numbers from input file  until the end of file for the first file */
            while (!inputFile.eof())
            {
                outputFile << number1 << '\n';
                inputFile >> number1;
            }

            /* end the loop */
            conditionMet = true;

        }


    /* if the end of the file has not been reached, then output number from input file 2 and then take in a new number */

        else if (!inputFile2.eof())
        {
            std::cout << inputFile2.eof() << "file2 eof before" << number2 << std::endl;
            outputFile << number2 << '\n';

            inputFile2 >> number2;
            std::cout << inputFile2.eof() << "file2 eof after" << number2 << std::endl;
        }



    }



}

/* close all files */
inputFile.close();
inputFile2.close();
outputFile.close();

return 0;

1 个答案:

答案 0 :(得分:3)

这是因为我的配置VIM(和emacs)总是以换行符结束文件。这样做是因为VIM是面向行的,对于C / C ++源代码,这确实是标准规定的。

通过尝试使用由一行组成的10Mb文件(不要这样做),可以看出VIM确实非常专门用于由相对较短的行组成的可能长文件。