LINUX.ORG.RU

Работа с файлами.

 , бида-бида


0

2

Бида. Не умею работать с файлами, раньше нужен был минимум то есть чтение, запись в файл fstream с этим справлялся хоть я и не знал весь его функционал. Но сейчас понадобилось очень много работать с файлами. А это:

1. Поиск файлов/диррикторий по маске т.е. искать ***abc.cba где вместо *** могут быть любые символы.

2. создание диррикторий/файлов( тут наверно fstream справиться, да?)

3. вытаскивание из файлов текста в том числе и построчно или до определенных символов( с этим опять же fstream справляется, ну с построчным чтением точно)

4. редактировние текста( fstream же, не?)

По сути надо решить только первый пункт, в какую сторону гуглить? fstream умеет такое?

1. Поиск файлов/диррикторий по маске т.е. искать ***abc.cba где вместо *** могут быть любые символы.

2. создание диррикторий/файлов( тут наверно fstream справиться, да?)

Этого нет в стандартной библиотеке, только некросплатформенные решения из POSIX, WinAPI, etc.

Kosyak ★★★★
()
Ответ на: комментарий от Kosyak

только некросплатформенные решения из

почему это «только» и не взять кроссплатформенные решения из других библиотек?

anonymous
()

1 и 2 стандартная библиотека не умеет. Используй либо нативные API ОС (т.е. POSIX в человеческих ОСях и WinAPI сам знаешь где), либо кроссплатформенные обертки, умеющие делать это.

3, 4 - кто тебе мешает fstream-ом это делать?

Deleted
()

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

2. файл можно создать через fstream, каталог - через тот же boost.filesystem

Vinick ★★
()
Ответ на: комментарий от nickionn

Можно использовать system() (а также popen, exec и всё остальное), но это - порочный подход. Намного правильнее - boost.filesystem и прочие, либо нативный POSIX API.

Deleted
()

И правда - бида-бида... Это же элементарно! Ниразу не понимаю зачем тут даже STL, не говоря уже о бустах.
И кстати Посикс вполне себе портабельный, по крайней мере большинство файловых операций в ВинАпи нормально реализовано.

Jetty ★★★★★
()

1. opendir, readdir и т.п.
2. man 2 mkdir
3. grep же
4. mmap. Тут нужно быть внимательным, чтобы не получить проблем при редактировании больших файлов. Например gedit дохнет на файле размером 100mb

invy ★★★★★
()
Ответ на: комментарий от invy

ты про баш? Ну команды я более менее знаю, мне надо было что бы программы. Редактировала, создавала папки/файлы. Искала их и т.д. Но все равно спасибо.

nickionn ★☆
() автор топика
Ответ на: комментарий от nickionn

Нет, я про Си.
1) http://linux.die.net/man/2/readdir (и т.д.)
2) http://linux.die.net/man/2/mkdir
3) я имел в виду - что тебе фактически нужно то, что делает grep, потому имеет смысл изучить. Опять же зависит от того, что надо выдирать из файла.
4) http://linux.die.net/man/2/mmap

invy ★★★★★
()
Ответ на: комментарий от invy

Спасибо, пошел смотреть что это.

Нет, я про Си.

на с++ заработает?

nickionn ★☆
() автор топика

как комплиривать с boost.filesystem?

вот это http://www.boost.org/doc/libs/1_37_0/libs/filesystem/example/simple_ls.cppp

не хочет комплиривать, ошибки:

./test.cpp: В функции «int main(int, char**)»:
./test.cpp:39:47: ошибка: «class boost::filesystem3::path» has no member named «file_string»
./test.cpp:46:28: ошибка: «class boost::filesystem3::path» has no member named «directory_string»
./test.cpp:84:43: ошибка: «class boost::filesystem3::path» has no member named «file_string»

ЧЯДНТ?

nickionn ★☆
() автор топика
Ответ на: как комплиривать с boost.filesystem? от nickionn

так делай,
#define BOOST_FILESYSTEM_VERSION 2 там где инклудишь ее
и если берешь какие-то семплы, то смотри под какую они версию
с 1.46 или 1.47 идет уже включена 3 версия и она по умолчанию

Boy_from_Jungle ★★★★
()

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

nanoolinux ★★★★
()

1. Поиск файлов/диррикторий по маске т.е. искать ***abc.cba где вместо *** могут быть любые символы.

QDir::setNameFilters, QDir::entryInfoList

2. создание диррикторий/файлов( тут наверно fstream справиться, да?)

QDir::mkdir, QFile::open

3. вытаскивание из файлов текста в том числе и построчно или до определенных символов( с этим опять же fstream справляется, ну с построчным чтением точно)

QTextStream

4. редактировние текста( fstream же, не?)

QTextStream, QString

По сути надо решить только первый пункт, в какую сторону гуглить? fstream умеет такое?

shutty
()
Ответ на: комментарий от nanoolinux

я бы лучше взял яву

ява будет слишком тормазить, тем более я ее не знаю)

nickionn ★☆
() автор топика
Ответ на: комментарий от shutty

Хм, надо будет попробывать кьют. Кстати он может эмм.. показывать SDL. Ну то есть, окно в нем все эти боксы, поле ввода и т.д. и небольшое участок с графикой.

nickionn ★☆
() автор топика
Ответ на: комментарий от Boy_from_Jungle

как ее вообще инклюдить? даже такое

#include "boost/filesystem/operations.hpp"


int main()
{
}

компилируеться с ошибкой


/tmp/ccrc8sxk.o: In function `__static_initialization_and_destruction_0(int, int)':
test.cpp:(.text+0x4a): undefined reference to `boost::system::generic_category()'
test.cpp:(.text+0x56): undefined reference to `boost::system::generic_category()'
test.cpp:(.text+0x62): undefined reference to `boost::system::system_category()'
collect2: выполнение ld завершилось с кодом возврата 1

nickionn ★☆
() автор топика
Ответ на: комментарий от nickionn

проблема решилась, линковал -lboost, а надо было -lboost_filesystem

nickionn ★☆
() автор топика

ни кто не подскажет как с помощью boost.filesystem вывести название каталогов? directory_iterator выводит и дирриктории и файлы, может с помощью него можно как то их различать?

//английский тутриал не осилил, ибо инглиш.

nickionn ★☆
() автор топика
Ответ на: комментарий от nickionn
 path p ("./");
  try
  {
    if (exists(p))    // does p actually exist?
    {
      if (is_regular_file(p))        // is p a regular file?
        cout << p << " size is " << file_size(p) << '\n';

      else if (is_directory(p))      // is p a directory?
      {
        cout << p << " is a directory containing:\n";

        copy(directory_iterator(p), directory_iterator(),  // directory_iterator::value_type
          ostream_iterator<directory_entry>(cout, "\n"));  // is directory_entry, which is
                                                           // converted to a path by the
                                                           // path stream inserter
      }
      else
        cout << p << " exists, but is neither a regular file nor a directory\n";
    }
    else
      cout << p << " does not exist\n";
  }

  catch (const filesystem_error& ex)
  {
    cout << ex.what() << '\n';
  }

использую это для вывода содержимого каталога, но как то слшиком длинно // взял из примеров с оф. сайта.

nickionn ★☆
() автор топика
Ответ на: комментарий от nickionn

Вот как раз подходящая ситуация, чтобы попробовать выполнить одну часть модулем на другом языке и прикрутить.

Xenon ★★★
()

отвалился boost после обновления gcc

$ g++ ./test.cpp -lboost_filesystem
/usr/bin/ld: /tmp/ccdHHuod.o: undefined reference to symbol '_ZN5boost6system15system_categoryEv'
/usr/bin/ld: note: '_ZN5boost6system15system_categoryEv' is defined in DSO /usr/lib/libboost_system.so.1.49.0 so try adding it to the linker command line
/usr/lib/libboost_system.so.1.49.0: could not read symbols: Invalid operation
collect2: ошибка: выполнение ld завершилось с кодом возврата 1

WTF?

nickionn ★☆
() автор топика
Ответ на: комментарий от nickionn

проблема решилась, теперь линковать нужно -lboost_system

nickionn ★☆
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.