Considerar que dispone de los siguientes archivos («testt.txt»)

abc
123
def
456
ghi
789
jkl
114

Ahora si quería actualizar la figura junto al nombre ghi (es decir,789),
¿cómo lo haría?

El siguiente código me ayuda a llegar allí rápidamente, sin duda, pero cómo actualizar rápidamente?

#include<iostream>
#include<fstream>
#include<string>

using namespace std;

int main() 
{
    int counter = 0;
    string my_string;
    int change = 000;
    ifstream file ( "testt.txt" );

    while(!file.eof())
    {
        counter = counter + 1;
        getline(file, my_string, '\n');
        if (my_string == "ghi") 
        {
            ofstream ofile ( "testt.txt" );
            for (int i = 0; i < counter + 1; i++)
            {
                //reached line required i.e. 789
                //how to process here?
            }
            ofile.close();
            break;
        }
    }
    cout << counter << endl;
    file.close();
    return 0;
}

Claramente el contador de aquí es de 5 correspondiente a «ghi»,
así contador + 1 punto a valor 789. Cómo cambiar a 000?

————SOLUCIONADO———–CÓDIGO FINAL——

 #include<iostream>
 #include<fstream>
 #include<string>
 #include <cstdio>

using namespace std;

int main() 
{
string x;
ifstream file ( "testt.txt" );
ofstream ofile ( "test2.txt" );
while (!file.eof())
{
    getline(file,x);
    if (x == "789")
    {
        ofile << "000" << endl;
    }
    else
        ofile << x << endl;
}
file.close();
ofile.close();
remove("testt.txt");
return 0;
}

De salida («test2.txt»)

abc
123
def
456
ghi
000
jkl
114
  • while(!file.eof())
  • Considere el uso de una base de datos, debido a que estas operaciones tienden a ser complicado el uso de simple acceso de archivo. De todos modos, la forma de abordar el problema, se reduce a «leer los datos», «modificar datos», «escribir datos», que es complicado, pero posible. En que paso exactamente ¿tienes problemas?
  • usted puede ver, está escrito en bucle for, y cualquier otro método que puede ser utilizado sin base de datos?? me refiero a escribir los datos actualizados a un nuevo archivo y eliminar vieja..
  • Es posible si usted tiene la certeza de las posiciones fijas de los datos. Buscar en la std::basic_ostream::seekp() método.
InformationsquelleAutor bikrathor | 2015-06-14

2 Comentarios

  1. 1

    Si abre un archivo con ifstream para la lectura y, a continuación, con ofstream para la escritura, la ofstream o bien no funcionan o sobrescribir el archivo – no estoy seguro de cuál es la opción correcta, pero tampoco es lo que quieres.

    Para uso std::fstream para abrir un archivo para lectura y escritura:

    fstream file ( "testt.txt" );

    Después de llegar al lugar adecuado, uso de la seekp método para habilitar la escritura en la secuencia después de la lectura de los (a menudo funciona sin seekp, pero cuando se produce un error, el error es muy difícil de encontrar), como requerido por la Norma:

    if (my_string == "ghi") 
    {
        file.seekp(file.tellg());
        ...
        break;
    }

    Cuando la modificación de archivos, usted tiene que reemplazar el existente bytes con los nuevos. Es importante escribir exactamente de 3 bytes, por lo que el valor 789 se sobrescribe correctamente. Así que es posible que desee comprobar el rango de:

    if (change < 0 || change > 999)
        abort(); //or recover from the error gracefully

    Y la anchura de la salida de campo antes de escribir:

    file << setw(3) << change;

    Si su código de interruptores de la escritura con la lectura, el uso de file.seekg(file.tellp()) para asegurarse de que funciona correctamente.

  2. 0

    Haciendo que generalmente no es fácil, debido a que los sistemas de archivos no almacenamos archivos de la línea de sabio, sino como una secuencia de bytes. Así que si usted sustituir una línea con digamos 4 caracteres por línea, con 5 caracteres, sobrescribirá algo en tu lado de la línea. Tendrías que leer el archivo en la memoria y, a continuación, volver a escribir de todo, desde su cambio de línea.

    Que una horrible enfoque, porque es increíblemente lento, y si se puede evitar, por no utilizar un archivo de texto para almacenar este tipo de información, usted debe hacer eso. Generalmente recomiendo el uso de algo como sqlite, para que las bibliotecas para todos los idiomas existen, si usted necesita para almacenar datos en las cosas que se sienten como tablas; para otro tipo de datos, hay otros enfoques de bases de datos relacionales, pero eso depende de lo que desea almacenar.

    • «no Hay manera de hacer que …» Que simplemente no es verdad.
    • Sí, y yo incluso ir tan lejos como el que se describe cómo es posible… Bueno, me voy, la edición de mi respuesta.
    • mejor?
    • No realmente, en términos de responder a la OP de la pregunta original.
    • Eso depende de lo que usted ve como la «pregunta original», y aún más si la vista «pregunta original» como un concepto relevante — ustedes saben, todo fluye 😀 no, en realidad, OP preguntó cómo cambiar esa línea, y mi respuesta fue «escribir la nueva línea y todas las líneas siguientes», y sinceramente, creo que las respuestas a su pregunta. El «no hay manera de hacer que» el inicio de mi respuesta vino de OP de la pregunta «¿hay una manera de hacerlo rápidamente», y, en general, no hay, si su archivo es de Gigabytes.
    • Tomar OP seriamente en lo que quieren lograr en el código, y mostrarles cómo. Si usted piensa que es un gráfico XY problema preguntó para, a continuación, extender esto como un comentario o notas adicionales en su respuesta.
    • Definitivamente tomar OP serio. La pregunta era El siguiente código ayúdame a llegar allí rápidamente, sin duda, pero cómo actualizar rápidamente??, y mi respuesta es ¿cómo se puede actualizar y por qué no es posible hacerlo rápido, por lo que creo que no necesita más commentation; veo que usted no está de acuerdo conmigo aquí.
    • podría por favor ayudarme en cómo iniciar la edición de la línea y escribir en un archivo nuevo??
    • Utilice su código existente para escribir cada línea de lectura (incluyendo «ghi») a su ofile, a continuación, escribir "000",y saltar a la siguiente línea en el archivo de entrada, y luego continuar a escribir todo lo que está en el archivo de entrada para el archivo de salida.
    • oh yeah gran @marcus, y de alguna manera hay que eliminar el antiguo yo.e testt.txt??
    • trate de no uso de la misma y de archivo de salida, para que la materia; te darás cuenta de que el «viejo» de la línea nunca se escriben en el archivo de salida. Como expliqué en mi respuesta, usted tendrá que leer en todo lo que viene después «ghi» en la memoria y, a continuación, poner de nuevo en su combinación y el archivo de salida si usted necesita para cambiar la longitud de la línea.
    • sí, yo escribí el siguiente código, y se crea un nuevo archivo de mi trabajo pero, ¿cómo eliminar el antiguo, es decir, testt.txt?
    • cadena de x; ifstream archivo ( «testt.txt» ); ofstream ofile ( «test2.txt» ); while (!archivo.eof()) { getline(archivo,x); if (x == «456») { ofile << «000» << endl; } else ofile << x << endl; } archivo.close(); ofile.close();
    • eso se ve muy bien. Funciona?
    • sí lo hace, pero ahora quiero pero ahora quiero eliminar el antiguo amigo
    • Ah te refieres a «eliminar el archivo», y no «eliminar la línea», aquí. Bien: #include <cstdio> y, a continuación,std::remove("filename"), ver man remove o cplusplus.com/reference/cstdio/remove
    • Greatt funcionó conjunto de todos los de ahora, gracias a un montón @marcus y todo el mundo..
    • feliz de escuchar funcionó. Creo que mi respuesta sería la ganancia de edición, añadiendo su (completa) de código, de modo que la gente puede encontrar esto 🙂

Dejar respuesta

Please enter your comment!
Please enter your name here