Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/161.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c+中的文件处理+;_C++_File Handling - Fatal编程技术网

C++ c+中的文件处理+;

C++ c+中的文件处理+;,c++,file-handling,C++,File Handling,我编写了下面的代码来输入文件中的数字,但是最后一个数字被打印了两次,这让我感到困惑。可能的答案是什么。 提前谢谢 代码: 文件说明的内容包括: 1 2 3 4 5 这是因为EOF标志仅在您尝试读取超过EOF时设置。(这是一个错误标志) 因此,您最好在循环结束时测试f.eof()。让我试着比前面的答案更具启发性f>>x读取一个整数,以便扫描输入中的数字。它先看到“5”,然后看到“\n”,这不是一个数字,因此它在“5”之后停止,并将x设置为5。它还没有遇到eof,您的循环再次执行,然后f>>x读

我编写了下面的代码来输入文件中的数字,但是最后一个数字被打印了两次,这让我感到困惑。可能的答案是什么。 提前谢谢

代码:

文件说明的内容包括:

1
2
3
4
5 

这是因为
EOF
标志仅在您尝试读取超过
EOF
时设置。(这是一个错误标志)


因此,您最好在循环结束时测试
f.eof()

让我试着比前面的答案更具启发性
f>>x
读取一个整数,以便扫描输入中的数字。它先看到“5”,然后看到“\n”,这不是一个数字,因此它在“5”之后停止,并将x设置为5。它还没有遇到eof,您的循环再次执行,然后
f>>x
读取“\n”,然后在到达eof时失败,保持
x
不变,然后再次打印5。因此,您需要在阅读后和打印前进行测试。最简单(也是首选)的方法是

while(f>>x)
    cout<<x<<endl;
while(f>>x)

cout到目前为止提出的每个解决方案都很好地解释了为什么操作码是错误的。但大多数人对这个问题的解决方法都不正确

如前多次所述,只有在尝试读取文件末尾之后,才会设置EOF标志。最后一次成功读取最多可读取(包括)最后一个字符。因此,在您的情况下,最后一次读取将从文件中读取5,然后打印它。然后,我们让renter进入循环(这将起作用,因为最后一次读取没有读过文件末尾,因此EOF为false)。尝试读取下一个字符将在
f>>x时失败,变量“x”将保持不变(在代码中,这意味着它的最后一个读取值为5),然后打印

解决方案是在完成读取后测试流的条件,以确保其工作。注意:您不应该只测试EOF,还有其他不好的状态。如果输入了其他坏状态之一,则当前代码将进入无限循环。要检查对象上的所有错误位,请调用fail()。因此,最简单的解决方案是将读取放入while测试(见下文)

#包括
#包括
使用名称空间std;
int main()
{
int x;
IFF流;
f、 未平仓(“票据”);
而(f>>x)
{
coutx;
如果(f)//不使用f.eof(),则存在其他错误状态。
{//这将实际调用f.fail(),以测试所有错误状态。
//因此,它只在读取有效时打印。


库蒂编译了它,它运行良好。你确定最后的“5”不是从某个地方打印出来的吗else@Mojo除非在5后面没有空格,甚至没有换行符,否则它不会正常工作。@沮丧的程序员:您选择的解决方案在任何情况下都不会工作。这完全是错误的。如果“5”是t中的最后一个字节,它会得到正确的结果他提交了…但这当然不能改变它是错误的事实。@沮丧的编码员您接受了错误的答案。请纠正这一点。注释是正确的,但解决方案是错误的。为什么会有勾号。@Martin,因为OP当然不知道它是错误的。我在回答中解释了为什么它是错误的。(你说我的答案也是错误的,但你没有给出任何理由,我相信你是错误的。请在你的评论中详细说明。)我认为编译器将“\0”视为文件的结尾,一旦遇到它,它就会设置标志eof。我尝试了这个方法,而(!f.eof()){f>>x;if(x!='\0')){ cout@Frustrated编码员:你很幸运,这就是为什么它能起作用。在阅读失败后,x的内容是不确定的。@Martin想解释一下吗?这个解决方案是有效的,并且在许多教科书中都有给出……那么,它出了什么问题,请告诉我?@Martin在你准备答案时,想想
f>>x的值是什么,以及隐式转换是什么是的。@Martin当然我最后一次读取失败了——失败退出了while循环,因此无法打印。显然,你在阅读我的答案时做得很差,并且错误地使用了我说的不应该使用的代码,就好像它是我的建议一样。@Martin谢谢。在说错话之前请更加小心。顺便说一句,我刚刚学会了NED C++在两天前(拖延了大约十年)。行为是很好定义的,不管输入文件包含什么。<代码>未定义行为<代码>在标准中有非常特定的含义,并且只适用于代码构造。在第二循环中:如果输入文件是空的(或者只包含空白)它将输出x(随机数)的内容一次。如果输入文件包含任何非数字,则第二个循环将进入无限循环(因为坏位将被设置为读取非整数,从而阻止从流中再次读取,因此永远无法设置eof位)。这很有趣,马丁。你给出了与我完全相同的解决方案(但没有额外的括号)。请提高你的阅读理解能力。@Martin我看到你删除了你对我的解决方案的评论……除了一条说“没有人有正确的问题解决方案”的评论…请编辑它。@Jim:你的代码行得通,但你的注释仍然是错误的。请重新阅读与
相关的内容,它的内容是“5”,然后是“\n”
@Martin如果“5”后面跟一个“\n”,那么它确实会这样做。当然,“5”后面可以跟一些其他非数字,但在这种情况下不是这样的。此外,你在这里的注释是这样说的每个答案都给出了一个很好的解释,但给出了一个错误的解决方案,这显然是错误的。@jim:不。在阅读了5之后,它将停止运行。'\n'不会从流中删除(因此,即使在5之后有零个字符,它也会工作)。更正错误,我将很乐意投票支持你。但如果你的答案中存在事实错误,则不会这样做。
1
2
3
4
5 
while(f>>x)
    cout<<x<<endl;
do{
    f>>x;
    cout<<x<<endl;
}while(!f.eof());
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
    int x;
    ifstream f;
    f.open("note");
    while(f>>x)
    {
            cout<<x<<endl;
    }
    return 0;
}
#include<iostream>
#include<fstream>
using namespace std;
int main()
{
    int x;
    ifstream f;
    f.open("note");
    while(f)
    {
            f>>x;
            if (f) // dont' use f.eof() there are other bad states.
            {      // This will actuall call f.fail() which test for all bad states.
                   // Thus it only prints if the read worked.

                  cout<<x<<endl;
            }
            // Alternatively you can put the read into the if
            if ( f >> x)
            {
                  // STUFF
            }
    }
    return 0;
}
#include <iostream>
#include <fstream>
#include <string>

int main()
{
    std::ifstream  file("txt");
    std::string    line;
    int            x;

    while(f >> x)
    {
        std::getline(f, line);   // If the '\n' was read then
                                 // this code would remove the next line.
                                 // As it works correctly it simply removes then
                                 // characters upto the newline character after the number.
        std::cout << x << "\n";
    }
}