как заменить строку другим кодом / c ++ - PullRequest
1 голос
/ 13 января 2012

Я работаю над Ubuntu. У меня есть файл с именем test.txt. Я хотел бы заменить вторую строку другой строкой. Как я могу это сделать? Я не хочу создавать новый файл и удалять первый.

Я хотел бы указать, что длина новой строки совпадает с длиной первой строки

Ответы [ 4 ]

1 голос
/ 14 января 2012

Попробуйте что-то вроде:

#include <fstream>
#include <string>

int main() {
    const int lineToReplace = 14;
    std::fstream file("myfile.txt", std::ios::in | std::ios::out);
    char line[255];
    for (int i=0; i<lineToReplace-1; ++i) 
        file.getline(line, 255); // This already skips the newline
    file.tellg();
    file << "Your contents here" << std::endl;
    file.close();
    return 0;
}

Обратите внимание, что line может содержать до 254 байтов (плюс нулевой терминатор), поэтому, если ваша строка занимает больше, настройте ее соответствующим образом.

1 голос
/ 13 января 2012

Если файл достаточно мал, вы можете прочитать его в память, сделать любые изменения, которые вы хотите, в копии в памяти, и записать, если получилось обратно.

Редактировать Код по запросу:

// A vector to store all lines
std::vector<std::string> lines;

// The input file
std::ifstream is("test.txt")

// Get all lines into the vector
std::string line;
while (std::getline(is, line))
    lines.push_back(line);

// Close the input file
is.close();

// All of the file is now in memory, each line a single entry in the vector
// "lines". The items in the vector can now be modified as you please.

// Replace the second line with something else
lines[1] = "Something else";

// Open output file
std::ofstream os("test.txt");

// Write all lines to the file
for(const auto& l : lines)
    os << l << '\n';

// All done, close output file
os.close();
0 голосов
/ 14 января 2012

Вот как бы я это сделал, без жесткого ограничения длины строки:

#include <fstream>
#include <string>

using namespace std;

int main()
{
    fstream file("test.txt",std::ios::in|std::ios::out);
    string line;
    string line_new="LINE2";

    // Skip the first line, file pointer points to beginning of second line now.
    getline(file,line);

    fstream::pos_type pos=file.tellg();

    // Read the second line.
    getline(file,line);

    if (line.length()==line_new.length()) {
        // Go back to start of second line and replace it.
        file.seekp(pos);
        file << line_new;
    }

    return 0;
}
0 голосов
/ 13 января 2012

Это Python, но он значительно более читабелен и краток для этой цели:

f = open('text.txt', 'w+') # open for read/write
g = tempfile.TemporaryFile('w+') # temp file to build replacement data
g.write(next(f)) # add the first line
next(f) # discard the second line
g.write(second_line) # add this one instead
g.writelines(f) # copy the rest of the file
f.seek(0) # go back to the start
g.seek(0) # start of the tempfile
f.writelines(g) # copy the file data over
f.truncate() # drop the rest of the file

Вы также можете использовать shutil.copyfileobj вместо writelines сделать блок копирования между файлами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...