Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/arduino/2.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++_Cout - Fatal编程技术网

C++ C++;为什么我只能拿到最后一行?

C++ C++;为什么我只能拿到最后一行?,c++,cout,C++,Cout,这是我的程序文本: #include <iostream> #include <string> #include <sstream> #include <fstream> using namespace std; int main(){ string line; ifstream inf("grid.txt"); while(!inf.eof()){ getline(inf, line);

这是我的程序文本:

#include <iostream>
#include <string>
#include <sstream>
#include <fstream>
using namespace std;

int main(){
    string line;
    ifstream inf("grid.txt");
    while(!inf.eof()){
        getline(inf, line);
        cout << line;
    }
    return 0;
}
我是在Cygwin和g++下编译的,下面是我得到的:

$ g++ program.cpp
$ ./a.exe
01 70 54 71 83 51 54 69 16 92 33 48 61 43 52 01 89 19 67 48
为了保存您的外观-这是文件的最后一行。如果我将循环替换为:

getline(inf, line);
cout << line;
getline(inf, line);
cout << line;
getline(inf,line);

cout尝试添加一个
std::endl
,它将自动附加一个换行符并刷新缓冲区


您还可以使用
istream&getline(istream&is,string&str,char-delim)
signature指定默认分隔符以外的另一个分隔符,即换行符,以防文件没有任何分隔符。

您没有在行尾发出换行符,因此它们会相互覆盖

将输出行更改为

cout << line << endl;

cout您正在使用getline读取二进制数据。尝试改用read()。

您的
grid.txt文件格式是什么?您的行可能以回车结束
\r

我刚问完问题,就试着:

cout << "hi";

它能完美地为我工作吗(不过在Fedora下使用g++)。适合我。但是,您应该在(getline(…)
时编写
。还要注意,
line
不包括行分隔符本身,因此您应该编写
cout@Philipp-“line”不包括行分隔符本身——宾果。它正在输出每一行,但每一行都会覆盖上一行,因为有\r但没有\n。。。Cygwin也有一些神奇的功能来咀嚼文本文件的行尾。@jmanning2k:有趣的是,它在从Emacs迷你缓冲区调用时有效,但在从Gnome终端调用时无效。但它需要Windows风格的行尾,否则任何东西都不能被覆盖。它不是二进制数据,它是文本数字。这不是十六进制转储吗?对不起,我弄错了为什么这两行会互相覆盖?它们应该被写成一行。这是OP的代码在VS2008上产生的输出。@Prae,因为他输出的是回车,而不是换行。不确定这是因为文件是这样写的,还是有什么东西吞没了换行符。是的,如果文件有
\r
行终止
getline()
将整个内容作为一行读取,包括所有
\r
。然后,当您将其打印到终端时,每次看到
\r
时,它都会一直跳回行首。因此,关于覆盖部分,您是对的,但您的解决方案不起作用,因为当您打印该
endl
时,损坏已经造成。我认为您的答案是正确的。我刚刚创建了一个带有
\r
行结束符的文本文件,然后代码只打印出最后一行。Cygwin/g++将采用Unix风格的行尾(只是
\n
),但如果您在Windows上创建文件,它可能包含
\r
字符,以便与手动打字机兼容。当我为CSCI 2最终项目进行数据挖掘时,我被
\r
咬了一口。因为行的长度不同,所以更容易看到,但更糟糕的是,我不知道char(13)/回车是什么。OTOH,如果你想要一行变化的数据,cr非常有用。我在组装课上经常用这个^_^
cout << "hi";