Estos son el contenido de mi archivo de ejemplo:

abcdefg hijk lmnopqrstAB CSTAKLJSKDJD KSA FIND ME akjsdkjhwjkjhasfkajbsdh ADHKJAHSKDJH

Necesito para encontrar y eliminar el «FIND ME’ dentro del archivo de modo que el resultado sería parecido a este:

abcdefg hijk lmnopqrstAB CSTAKLJSKDJD KSA akjsdkjhwjkjhasfkajbsdh ADHKJAHSKDJH

He probado el siguiente método para hacer getline y, a continuación, escribir todo el contenido, excepto el ME ENCUENTRE en un archivo temporal y, a continuación, cambie el nombre del archivo temporal de la espalda.

string deleteline;
string line;

ifstream fin;
fin.open("example.txt");
ofstream temp;
temp.open("temp.txt");
cout << "Which line do you want to remove? ";
cin >> deleteline;



while (getline(fin,line))
{
    if (line != deleteline)
    {
    temp << line << endl;
    }
}

temp.close();
fin.close();
remove("example.txt");
rename("temp.txt","example.txt");

pero no funciona.
Sólo como nota: el archivo NO tiene newline/saltos de línea. Por lo que el contenido de los archivos, todo está escrito en 1 línea.

EDICIÓN:

CÓDIGO FIJO:

while (getline(fin,line))
{
    line.replace(line.find(deleteline),deleteline.length(),"");
    temp << line << endl;

}

Esto me consigue los resultados que yo esperaba. Gracias a todos por ayudar!

Se puede utilizar sed en lugar de C++? O es esta tarea?
Todo el contenido en el archivo está en una sola línea? ¿Cómo se puede comparar la frase completa con la parte de la frase?
Prefiero no usar los comandos de unix, si es posible. No es la tarea. Solo estoy tratando de hacer las cosas por mi propia educación
Intenté hacerlo con cada línea, separados por una línea de alimentación, por alguna razón, no funciona. Pero sí, necesito encontrar una línea en un archivo y eliminarlo desde allí.
Yo no tengo esta función getline(fin de línea) en visual studio.

OriginalEl autor Venraey | 2014-10-26

3 Comentarios

  1. 3

    Intente esto:

    line.replace(line.find(deleteline),deleteline.length(),"");
    Funcionó! Muchas gracias!
    Me alegro de que funcionó! Por qué no añadir una nota y una versión fija de código en su pregunta? 😉

    OriginalEl autor gmas80

  2. 5

    En caso de que alguien quisiera que me han convertido Venraey útil del código de una función:

    #include <iostream>
    #include <fstream>
    
    void eraseFileLine(std::string path, std::string eraseLine) {
    std::string line;
    std::ifstream fin;
    
    fin.open(path);
    std::ofstream temp; //contents of path must be copied to a temp file then renamed back to the path file
    temp.open("temp.txt");
    
    while (getline(fin, line)) {
        if (line != eraseLine) //write all lines to temp other than the line marked fro erasing
            temp << line << std::endl;
    }
    
    temp.close();
    fin.close();
    
    const char * p = path.c_str(); //required conversion for remove and rename functions
    remove(p);
    rename("temp.txt", p);}

    OriginalEl autor Cuinn Herrick

  3. 0

    Me gustaría aclarar algo. Aunque la respuesta proporcionada por gmas80 podría trabajar, para mí, no. He tenido que modificar un poco, y he aquí lo que terminó con:

    position = line.find(deleteLine);
    
    if (position != string::npos) {
        line.replace(line.find(deleteLine), deleteLine.length(), "");
    }

    Otra cosa que no me satisfacía era que la izquierda líneas en blanco en el código. Así que me escribió otra cosa para eliminar las líneas en blanco:

    if (!line.empty()) {
        temp << line << endl;
    }

    OriginalEl autor X1NK3R

Dejar respuesta

Please enter your comment!
Please enter your name here