【问题标题】:Why does my code only read the last line of the file?为什么我的代码只读取文件的最后一行?
【发布时间】:2014-01-01 19:52:01
【问题描述】:

我正在编写一个应用程序,它将一些预编译的包安装到 ARM Chromebook 上,我不想每次添加新包时都更新我的程序,所以我将它设置为只下载我拥有的所有包的列表(我可以更新),然后检查它是否是我已经编译并上传到我的网站的包。

问题是,它似乎只读取了文件的最后一行。 最让我困惑的是它只读取这个特定文件的最后一行。 它读取所有行的大多数其他文件都很好。

这是我的代码:

#include <iostream>
#include <cstdlib>
#include <string>
#include <fstream>
#include <cstdio>
using namespace std;

int main(int argc, char* args[]) {
    if (argc < 2) {
        cout << "Please specify an application name.\n";
        return 0;   
    }
    cout << "Fetching list...\n";
    system("wget -N www.charmbrew.tk/files/list --quiet");

    cout << "Reading application list...\n";
    string line;
    string package = args[1];   
    bool isInList = false;  

    ifstream list("list");
    while (getline(list,line)) {
        cout << line;
        if (line == package) isInList = true;
    }
    list.close();
...
}

此代码仅读取文件的最后一行。 该文件包含三行,但它只读取最后一行。 除了我电脑上的这个文件之外的所有其他文件,它将读取所有行。

下载后我检查了文件。我知道它有多行文本。 但是出于某种原因,我的代码一直只读取最后一行。

文本文件只是一个简单的文本文件。没什么特别的。你可以自己下载看看。

【问题讨论】:

  • 检查行尾。 Windows 使用 CR/LF,而 linux/unix 使用 LF。
  • @TimDave 正如OP所说,您可以自己检查。这些行是 CRLF 分隔的。文件中不存在其他控制字符。

标签: c++


【解决方案1】:

代码读取每一行,但文件list 以CR LF 作为行结尾。这意味着读取的每一行都在末尾包含一个\r,这会导致下一行覆盖前一行。

如果要查看所有行,请使用

cout << line << '\n';

这是在 Unix 系统上,行尾仅是换行符。在 Windows 系统上,您将 CR LF 作为行尾,在那里您应该看到一行中的所有行都写为

nanovimlynx

【讨论】:

  • 好电话!您可能应该添加 "if run on a *NIX system".
  • 好一个。我忘记了 getline 并没有默默地将 \r\n 更改为 \n。
  • @MrLister 这是相反的效果:在 *NIX 上没有发生转换,即 \n (LF) 被剥离,留下一个唯一的 \r 字符 (CR)。在 Windows 上运行代码就好了,尽管所有内容都写在同一行上。
  • @IInspectable 谢谢你的提示。
  • 注意只有在返回时才删除最后一个字符!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-14
相关资源
最近更新 更多