我目前在使用我的程序正确设置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;
答案 0 :(得分:3)
这是因为我的配置VIM
(和emacs
)总是以换行符结束文件。这样做是因为VIM是面向行的,对于C / C ++源代码,这确实是标准规定的。
通过尝试使用由一行组成的10Mb文件(不要这样做),可以看出VIM
确实非常专门用于由相对较短的行组成的可能长文件。