【问题标题】:Creating/writing into a new file in Qt在 Qt 中创建/写入新文件
【发布时间】:2011-06-22 10:03:12
【问题描述】:

我正在尝试写入文件,如果文件不存在,请创建它。我在互联网上搜索过,但没有任何对我有用的东西。

我的代码目前看起来像这样:

QString filename="Data.txt";
QFile file( filename );
if ( file.open(QIODevice::ReadWrite) )
{
    QTextStream stream( &file );
    stream << "something" << endl;
}

如果我在目录中创建一个名为 Data 的文本文件,它仍然是空的。如果我不创建任何东西,它也不会创建文件。 我不知道该怎么办,这不是我尝试创建/写入文件的第一种方式,并且没有一种方式有效。

感谢您的回答。

【问题讨论】:

    标签: c++ qt


    【解决方案1】:
    QFile file("test.txt");
    /*
     *If file does not exist, it will be created
     */
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text | QIODevice::ReadWrite))
    {
        qDebug() << "FAILED TO CREATE FILE / FILE DOES NOT EXIST";
    }
    
    /*for Reading line by line from text file*/
    while (!file.atEnd()) {
        QByteArray line = file.readLine();
        qDebug() << "read output - " << line;
    }
    
    /*for writing line by line to text file */
    if (file.open(QIODevice::ReadWrite))
    {
        QTextStream stream(&file);
        stream << "1_XYZ"<<endl;
        stream << "2_XYZ"<<endl;
    }
    

    【讨论】:

      【解决方案2】:

      原因可能不是您没有找到正确的目录。例如,您可以从文件中读取(即使没有绝对路径),但似乎无法写入。

      在这种情况下,可能是您的程序在写入完成之前就退出了。

      如果您的程序使用事件循环(例如使用 GUI 应用程序,例如 QMainWindow),这不是问题。但是,如果您的程序在写入文件后立即退出,您应该刷新文本流,关闭文件并不总是足够的(而且没有必要,因为它在析构函数中关闭)。

      stream << "something" << endl;
      stream.flush();
      

      这保证了在程序从该指令继续之前将更改提交到文件。

      问题似乎是 QFile 在 QTextStream 之前被破坏。因此,即使在 QTextStream 析构函数中刷新流,也为时已晚,因为文件已经关闭。

      【讨论】:

        【解决方案3】:

        您的代码非常好,只是您没有在正确的位置找到您的文件。由于您没有提供绝对路径,因此您的文件将相对于当前工作文件夹创建(在您的情况下更准确地说是在当前工作文件夹中)。

        您当前的工作文件夹由 Qt Creator 设置。转到项目>>您选择的构建>>按“运行”按钮(在“构建”旁边),您将在此页面上看到它是什么,当然您也可以更改。

        【讨论】:

          【解决方案4】:

          您确定您在正确的目录中吗?
          打开没有完整路径的文件将在当前工作目录中打开它。在大多数情况下,这不是您想要的。尝试将第一行更改为

          QString filename="c:\\Data.txt"
          QString filename="c:/Data.txt"

          并查看文件是否在c:\中创建

          【讨论】:

          • 我确实在错误的目录中。 c:\Data.txt 虽然没有在 c:\ 中创建它...它与 cpp 文件所在的文件夹不同。它位于一个文件夹中,其中包含一个带有 .exe 的文件夹
          • @Tom83B 这是预期的行为。 .exe 是创建文本文件的东西,而不是 .cpp 文件。另外,您应该尝试“C:\Data.txt”,驱动器号可能区分大小写。
          • 驱动器号不区分大小写 - 但您需要执行 "c:\\" 或 "c:/" 以避免 \ 被视为转义
          • 只是 QT 4.8 文档中对此答案的更新:“QFile 期望文件分隔符为/,无论操作系统如何。使用其他分隔符(例如,'\')不是支持的。” .. 所以请确保使用正斜杠/ 作为文件路径。来源:doc.qt.io/qt-4.8/qfile.html
          【解决方案5】:
          #include <QFile>
          #include <QCoreApplication>
          #include <QTextStream>
          
          int main(int argc, char *argv[])
          {
              // Create a new file     
              QFile file("out.txt");
              file.open(QIODevice::WriteOnly | QIODevice::Text);
              QTextStream out(&file);
              out << "This file is generated by Qt\n";
          
              // optional, as QFile destructor will already do it:
              file.close(); 
          
              //this would normally start the event loop, but is not needed for this
              //minimal example:
              //return app.exec();
          
              return 0;
          }
          

          【讨论】:

          • 这实际上并没有解决 OP 的问题,您的代码 any 也与他们的不同......
          • @Troyseph 非常感谢您的反馈。如果你愿意,请编辑我的答案。
          【解决方案6】:

          这很奇怪,一切看起来都很好,你确定它不适合你吗?因为这个main 肯定对我有用,所以我会在其他地方寻找问题的根源。

          #include <QFile>
          #include <QTextStream>
          
          
          int main()
          {
              QString filename = "Data.txt";
              QFile file(filename);
              if (file.open(QIODevice::ReadWrite)) {
                  QTextStream stream(&file);
                  stream << "something" << endl;
              }
          }
          

          您提供的代码也与detailed description of QTextStream 中提供的代码几乎相同,所以我很确定问题出在其他地方:)

          另请注意,该文件不称为Data,而是Data.txt,应在运行程序的目录中创建/定位(不一定是可执行文件所在的目录)。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-10-04
            • 1970-01-01
            • 1970-01-01
            • 2014-12-26
            • 2014-10-23
            • 1970-01-01
            相关资源
            最近更新 更多