C ++ удалить последний символ в текстовом файле - PullRequest
4 голосов
/ 02 марта 2012

Мне нужна помощь по удалению последнего символа в текстовом файле. Например, если мой текстовый файл содержит 1234567, мне нужен код C ++, чтобы удалить последний символ, чтобы файл стал 123456. Спасибо, ребята.

Ответы [ 4 ]

5 голосов
/ 02 марта 2012

Единственный способ сделать это в переносимом коде - это прочитать данные и выписать все, кроме последнего символа.

Если вы не возражаете против непереносимого кода, большинство систем предоставляют способы усечения файла. Традиционный метод Unix состоит в том, чтобы искать место, где вы хотите, чтобы файл заканчивался, а затем выполнить запись 0 байтов в файл в этой точке. В Windows вы можете использовать SetEndOfFile. Другие системы будут использовать другие имена и / или методы, но почти все будут иметь возможность в той или иной форме.

4 голосов
/ 02 марта 2012

Для портативного решения, что-то вроде этого должно сделать работу:

#include <fstream>

int main(){
    std::ifstream fileIn( "file.txt" );              // Open for reading
    std::string contents;
    fileIn >> contents;                              // Store contents in a std::string
    fileIn.close();
    contents.pop_back();                             // Remove last character
    std::ofstream fileOut( "file.txt", std::ios::trunc ); // Open for writing (while also clearing file)
    fileOut << contents;                             // Output contents with removed character
    fileOut.close();

    return 0;
}
2 голосов
/ 06 июня 2018

Вот более надежный метод, если исходить из ответа Алекса З:

#include <fstream>
#include <string>
#include <sstream>

int main(){
    std::ifstream fileIn( "file.txt" );                   // Open for reading

    std::stringstream buffer;                             // Store contents in a std::string
    buffer << fileIn.rdbuf();
    std::string contents = buffer.str();

    fileIn.close();
    contents.pop_back();                                  // Remove last character


    std::ofstream fileOut( "file.txt" , std::ios::trunc); // Open for writing (while also clearing file)
    fileOut << contents;                                  // Output contents with removed character
    fileOut.close(); 
}

Хитрость заключается в том, что эти строки позволяют эффективно считывать весь файл в строку, а не просто токен:

    std::stringstream buffer;
    buffer << fileIn.rdbuf();
    std::string contents = buffer.str(); 

Это вдохновлено первым решением Джерри Коффина в этом посте . Там должно быть самое быстрое решение.

1 голос
/ 02 марта 2012

Если входной файл не слишком большой, вы можете сделать следующее: -

1. Read the contents into a character array.
2. Truncate the original file.
3. Write the character array back to the file, except the last character.

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

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