【问题标题】:Reading a txt file using QTextStream C++使用 QTextStream C++ 读取 txt 文件
【发布时间】:2013-02-27 15:13:42
【问题描述】:

我正在编写一个我以前在 Java 中完成的小程序,但是我想尝试在 C++ 中实现相同的工作。这个想法是合并两个文本文件

文件1:

a
b
c

文件2:

1
2
3

输出文件应为:

a1
b2
c3

我查看了 QTextStream 文档,这是将文件逐行读取为字符串的建议代码

QFile file(input); // this is a name of a file text1.txt sent from main method
if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
{
    return 1;
}
QTextStream in(&file);
QString line = in.readLine();
while (!line.isNull())
{
    line = in.readLine();
}

但由于某种原因,根本没有从文件中加载任何内容。我通过向控制台打印“行”来证明这一点,但一无所获。

所以有什么想法吗?我想要的只是读取文件并以这样的字符串结束

QString text1 = "a\n2\n3"

我会为这两个文件执行此操作,将字符串拆分为 QStringList(很可能)以我想要的格式将它们连接在一起并将它们写入第三个 txt 文件。

【问题讨论】:

  • 感谢语法纳粹的阻拦而不是帮助
  • 是的,我知道@Roku 这基本上就是我要问的,它甚至没有读取文件,因为所有的 'input1' 都是,'text1.txt' 没有文件路径
  • 有什么特定的原因必须是 QTextStream 吗?

标签: c++ qt


【解决方案1】:

如果你想要整个文件,为什么要逐行阅读?

QString line = in.readAll();

另外,您的 while 循环是错误的,您需要 while (!in.atEnd()) 获取文本流,而不是检查字符串是否为空。

readLine 不会包含换行符。

无论如何,同时打开两个文件并在旅途中构建您的字符串比拆分和连接要容易得多。

QFile f1("h:/1.txt");
QFile f2("h:/2.txt");

f1.open(QIODevice::ReadOnly | QIODevice::Text);
f2.open(QIODevice::ReadOnly | QIODevice::Text);

QString s;

QTextStream s1(&f1);
QTextStream s2(&f2);

for (int i = 0; i < 3; ++i) {
    s.append(s1.readLine());
    s.append(s2.readLine());
    if (i != 2)s.append("\n");
}

【讨论】:

  • 为答案欢呼似乎正是我所需要的,但它仍然什么也没读,txt 文件必须在哪里才能被 f1("text1.txt") 读取,因为我基本上可以放在java中并从项目文件夹中读取?
  • 嗯,它对我有用,文件在哪里并不重要,我对其进行了硬编码,但只要您传递文件的有效路径,它就应该可以工作。您没有得到输出可能是因为您没有正确打开文件。你的方法返回 1 吗?
  • 不,我的意思是我没有放入文件路径,而是像在 java 中那样放入文件名(然后在项目文件夹中查找该名称)我这样做是因为我正在获取文件名通过来自控制台的用户输入,这是否有效,或者我实际上是否必须指定一个文件路径,因为这似乎很愚蠢,没有办法只指定一个名称
  • 如果你没有指定完整的文件路径,文件是从当前目录读取的。这取决于如何运行您的应用程序。而且它与 C++ 或 Java 没有任何关系。
  • 除了 while 循环之外,您的代码看起来没问题,所以您没有得到输出的原因是 input 不是有效的文件路径和名称。如果文件在您的项目文件夹中,您只需要文件名。
【解决方案2】:

如果文件名不包含完整路径,但您非常确定该文件与您的应用程序位于同一目录中,请使用如下应用程序路径:

QString filename = QCoreApplication::applicationDirPath() + "/" + input;

【讨论】:

    【解决方案3】:

    试试这个块-:

    while(!in.atEnd())
    {
       QString line = in.readLine();   
       ....
    }
    

    您是否使用此 while 循环获得输出?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-22
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多