2011-01-11 4 views
0

У меня есть требование для чтения, обновления и удаления файла. Я хочу написать класс для этого. НапримерУправление файлами в C++

class FileManagement { 
private: 
    fstream myFile; 

public: 
    void read(); 
    void update(); 
    void delete(); 

}; 

Мой вопрос заключается в то время как обновление возможно удалить только одну строку в файле в C++ и должны быть портативными, если это возможно, как мы можем достичь этого. Другой вопрос: если выше вариант невозможен, как мы можем достичь вышеуказанного.

В C++ как мы можем удалить файл переносимым способом.

Спасибо!

+1

Ваш пример кода не является правильным C++. delete - это ключевое слово языка, и вы не можете использовать его в качестве имени функции-члена. –

ответ

2

Вы, кажется, задаете два разных вопроса сразу, запутанным образом.

  • Чтобы удалить файл, используйте функцию remove, найденную в stdio.h.
  • К удалите одну строку файла, вы должны прочитать весь файл и записать его с удаленной линией. Для этого нет никакой библиотечной процедуры. Стандартный «безопасный» метод состоит в том, чтобы прочитать весь файл, записать его обратно (с линией, которую вы не хотите удалить) в новый файл в том же каталоге, fsync новый файл, закройте его, затем rename новый файл для старого имени. Если вы не заботитесь о одновременных чтениях или сбое компьютера в середине операции, вы можете вместо этого открыть старый файл для чтения/записи, прочитать его содержимое в памяти, rewind дескриптор файла и переписать его напрямую.
1

Вы должны посмотреть на стандарт posix и найти файлы операций (например, fopen()). Где платформы не поддерживают POSIX, или отклоняются от стандарта, вам, вероятно, потребуется

 
#ifdef NONPOSIXOS1 // really, this should be a good identifier of hte OS 
    // write code to handle the special case 
#else 
    // write code to handle the posix compliant case 
#endif 
+1

Вы можете сделать это со стандартными функциями C/C++. –

0

Большинство систем будет принимать Posix совместимые заявления. Вы всегда можете просто определить абстрактный базовый класс и создать различные конкретные реализации, которые используют любые необходимые для конкретной команды инструкции. У вас может быть один, если def, который создает правильный конкретный класс.

+0

спасибо, но мой вопрос в том, как мы можем удалить одну строку файла в C++ – venkysmarty

+0

Да, вы читаете все данные при использовании потока, управляющего вашими данными, и записываете их обратно. это самый простой способ. – rerun

7

Я рекомендую Boost Filesystem.

Его описание гласит: «подпиточный Filesystem Библиотека предоставляет портабельные средства для и манипулируют пути, файлы и каталоги.»

+0

boost :: файловая система не распространяется на чтение/запись файлов. – chris

+1

boost :: filesystem - это хороший способ манипулировать файловыми и каталогическими путями, поскольку он затрагивает кодировки символов несколько независимым от платформы образом. Что касается реального ввода/вывода данных, способ C++ - использовать функции iostream, но функции C из stdio могут обеспечить лучшую производительность. – kgriffs

+0

@chris это точно – blue

0

Если вы ищете более высокого уровня C++ библиотека, которая является объектно-ориентированным и может обрабатывать как манипуляцию имен файлов и файловый ввод/вывод, ПОКО достойный выбор:

http://pocoproject.org

ACE это более старая, проверенная временем платформа, которая включает в себя множество поддержки ввода-вывода.Это обычно используется для его отличная поддержка CORBA, но есть много там:

http://www.cs.wustl.edu/~schmidt/ACE-overview.html

И, наконец, есть QT. Обычно он известен своей кросс-платформенной библиотекой пользовательского интерфейса, QT фактически включает в себя несколько других полезных элементов (включая управление файлами и ввода-вывода), и вам даже не нужно ссылаться на материал пользовательского интерфейса, если он вам не нужен.

http://qt.nokia.com/

Если вы не хотите принести в других рамках, я рекомендовал бы добавить собственный File I/O классы, использующие файловую систему наддува :: и либо стандартный iostream или STDIO функцию. Вы можете использовать интерфейсы в вышеуказанных рамках как ссылку, но вы также захотите ознакомиться с современным дизайном C++, как продемонстрировано Boost и объяснено в Modern C++ Design.

Смежные вопросы