2011-02-06 14 views
40

Estoy tratando de escribir en un archivo y si el archivo no existe, créelo. He buscado en Internet y nada funcionó para mí.Crear/escribir en un nuevo archivo en Qt

Mi código es actualmente la siguiente manera:

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

Si se crea un archivo de texto llamado de datos en el directorio, que permanece vacío. Si no creo nada, tampoco crea el archivo. No sé qué hacer con esto, esta no es la primera manera en que traté de crear/escribir en un archivo y ninguna de las formas funcionó.

Gracias por su respuesta.

Respuesta

21

¿Estás seguro de que estás en el directorio correcto?
Abrir un archivo sin una ruta completa lo abrirá en el directorio de trabajo actual. En la mayoría de los casos, esto no es lo que quieres. Intente cambiar la primera línea de

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

y ver si se crea el archivo en c:\

+0

Estaba realmente en el directorio incorrecto. c: \ Data.txt no lo creó en c: \ embargo ... Estaba en una carpeta diferente a la de los archivos cpp. Estaba en una carpeta que contenía una carpeta con .exe – Tom83B

+3

@ Tom83B Ese es el comportamiento esperado. El .exe es lo que crea el archivo de texto, no los archivos .cpp. Además, debe probar "C: \ Data.txt", la letra de la unidad puede ser sensible a mayúsculas y minúsculas. –

+10

La letra de la unidad no distingue entre mayúsculas y minúsculas, pero debe hacer "c: \\" o "c: /" para evitar que se trate como un escape –

20

Eso es raro, todo se ve bien, ¿está seguro de que no funciona para usted? Porque este main seguramente me funciona, así que buscaría el origen de su problema en otro lado.

#include <QFile> 
#include <QTextStream> 


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

El código que ya ha proporcionado también es casi el mismo que el previsto en detailed description of QTextStream así que estoy bastante seguro de que el problema está en otra parte :)

También tenga en cuenta, que el archivo no se conoce, pero DataData.txt y debe crearse/ubicarse en el directorio desde el que se ejecutó el programa (no necesariamente en el que se encuentra el ejecutable).

8
#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; 
} 
+1

Eso y en realidad no aborda el problema del OP, ni su código * es * diferente al de ellos ... – Troyseph

+0

@Troyseph gracias mucho para comentarios. Si quieres, edita mi respuesta. –

3

Su código está perfectamente bien, se le acaba no buscando en el lugar correcto para buscar el archivo. Como no ha proporcionado la ruta absoluta, su archivo se creará en relación con la carpeta de trabajo actual (más precisamente en la carpeta de trabajo actual en su caso).

Qt Creator establece su carpeta de trabajo actual. Vaya a Proyectos >> Su compilación seleccionada >> Presione el botón 'Ejecutar' (al lado de 'Compilar') y verá lo que es en esta página, que por supuesto puede cambiar también.

enter image description here

0
QFile file("test.txt"); 
/* 
* If file not exit it will create 
* */ 
if (!file.open(QIODevice::ReadOnly | QIODevice::Text | QIODevice::ReadWrite)) 
{ 
    qDebug() << "FAIL TO CREATE FILE/FILE NOT EXIT***"; 
} 

/*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; 
} 
0

Puede suceder que la causa no es que usted no encuentra el directorio correcto. Por ejemplo, puede leer desde el archivo (incluso sin una ruta absoluta) pero parece que no puede escribir en él.

En ese caso, es posible que programe salidas antes de que se pueda finalizar la escritura.

Si su programa utiliza un bucle de evento (como con una aplicación GUI, por ejemplo, QMainWindow) no es un problema. Sin embargo, si su programa se cierra inmediatamente después de escribir en el archivo, debe enjuagar la secuencia de texto, cerrar el archivo no siempre es suficiente (y no es necesario, ya que está cerrado en el destructor).

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

Esto garantiza que los cambios se confirman en el archivo antes de que el programa continúa a partir de esta instrucción.

El problema parece ser que el QFile se destruye antes que QTextStream. Por lo tanto, incluso si la secuencia se vacía en su constructor, ya es demasiado tarde, ya que el archivo ya está cerrado.

Cuestiones relacionadas