crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

 
Ответить в данную темуНачать новую тему
> Стандартные операции с файлами
Andrew Selivanov
  опции профиля:
сообщение 13.2.2008, 16:32
Сообщение #1


Участник
**

Группа: Участник
Сообщений: 249
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 3

Спасибо сказали: 15 раз(а)




Репутация:   6  


Вообщем то не открою Америки...
Удалить файлик стандартно можно так: std::remove("path");
Переименовать файлик: std::rename("from","to");

А вот копирование можно сделать ну не менее чем 30-ю разными способами :) И самый быстрый способ будет Си-шный. Если кому интересно скину.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 13.2.2008, 17:33
Сообщение #2


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


скинь коль уж начал
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrew Selivanov
  опции профиля:
сообщение 13.2.2008, 18:35
Сообщение #3


Участник
**

Группа: Участник
Сообщений: 249
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 3

Спасибо сказали: 15 раз(а)




Репутация:   6  


Цитата(Litkevich Yuriy @ 13.2.2008, 17:33) *
скинь коль уж начал


Дык не вопрос, совершенно не вопрос...
По ссылке можно найти и результаты тестирования в том числе, в этом сообщении сами исходники
http://groups.google.com/group/perfo/brows...4466f69541c2e63

===================== 4. Methods of copying : BEGIN ===================== 

FILE*         ifp;  // input  file pointer
FILE*         ofp;  // output file pointer

int           ifd;  // input  file descriptor; UNIX
int           ofd;  // output file descriptor; UNIX

ifstream      ifs;  // input  file stream
ofstream      ofs;  // output file stream

// -----
// Note. Files are tested in both modes text and binary
// -----

char          ch;
int           ich;
const int     newline_int_symbol (int ('\n'));

size_t        nread;
streamsize    len;
size_t        no_of_file_bytes;  // File size (number of bytes)
size_t        no_of_file_lines;  // Number of file lines
// -----
// Note. 'no_of_file_bytes' doesn't contain number of '\r' in '\r\n'
// -----

char          const_buf [4096];
char*         max_buf = new char [no_of_file_bytes + no_of_file_lines + 1];

string        line;
string        str;
ostringstream oss;

struct char_identity { char operator()(char ch) const { return ch; } };

    ### C-01: C-Functions getc() and putc()
    ------------------------------------------------
    while ((ich = getc(ifp)) != EOF) putc(ich, ofp);
    ------------------------------------------------

    ### C-02: C-Functions fgetc() and fputc()
    ------------------------------------------------
    while ((ich = fgetc(ifp)) != EOF) fputc(ich, ofp);
    ------------------------------------------------

    ### C-03: C-Functions fread() and fwrite() - with const size buffer
    ------------------------------------------------
    while ((nread = fread(const_buf, sizeof(char), sizeof(const_buf), ifp)) > 0)
    {
      fwrite(const_buf, sizeof(char), nread, ofp);
    }
    ------------------------------------------------

    ### C-04: C-Functions fread() and fwrite() - with max size buffer
    ------------------------------------------------
    while ((nread = fread(max_buf, sizeof(char), sizeof(max_buf), ifp)) > 0)
    {
      fwrite(max_buf, sizeof(char), nread, ofp);
    }
    ------------------------------------------------

    ### Unix-C-05: UNIX system call mmap()
    ------------------------------------------------
    size_t actual_file_size = no_of_file_bytes + ((text-mode) ? no_of_file_lines : 0)
    char* ptr = (char*)mmap(0, actual_file_size, PROT_READ, MAP_SHARED, ifd, 0);
    write(ofd, ptr, actual_file_size);
    munmap(ptr, actual_file_size);
    ------------------------------------------------

    ### CPP-01: istream::operator>> and ostream::operator<<
    ------------------------------------------------
    ifs.unsetf(ios::skipws);
    while (ifs >> ch) ofs << ch;
    ------------------------------------------------

    ### CPP-02: streambuf::sbumpc() and streambuf::sputc()
    ------------------------------------------------
    while ((ch = ifs.rdbuf()->sbumpc()) != EOF) ofs.rdbuf()->sputc(ch);
    ------------------------------------------------

    ### CPP-03: streambuf::sbumpc() and ostream::operator<<
    ------------------------------------------------
    ch = ifs.rdbuf()->sbumpc();
    ofs << ch;
    while (ch != EOF)
    {
      ofs << ifs.rdbuf();
      ch = ifs.rdbuf()->sbumpc();
    }
    ------------------------------------------------

    ### CPP-04: ifstream::rdbuf() and ostream::operator<<
    ------------------------------------------------
    ofs << ifs.rdbuf();
    ------------------------------------------------

    ### CPP-05: istream::read() and ostream::write() - with const size buffer
    ------------------------------------------------
    while (!ifs.eof())
    {
      ifs.read (const_buf, sizeof(const_buf));
      ofs.write (const_buf, ifs.gcount());
    }
    ------------------------------------------------

    ### CPP-06: istream::read() and ostream::write(), std::ostringstream, ostream::operator<< - with const buffer
    ------------------------------------------------
    while (!ifs.eof())
    {
      ifs.read (const_buf, sizeof(const_buf));
      oss.write (const_buf, ifs.gcount());
    }
    ofs << oss.str();
    ------------------------------------------------

    ### CPP-07: istream::readsome() and ostream::write() - with const size buffer
    ------------------------------------------------
    do
    {
      len = ifs.readsome (const_buf, sizeof(const_buf));
      ofs.write (const_buf, len);
    } while (len);
    ------------------------------------------------

    ### CPP-08: istream::read() and ostream::write() - with max size buffer
    ------------------------------------------------
    while (!ifs.eof())
    {
      ifs.read (max_buf, no_of_file_bytes + no_of_file_lines);
      ofs.write (max_buf, ifs.gcount());
    }
    ------------------------------------------------

    ### CPP-09: std::getline, std::ostringstream, ostream::operator<<
    ------------------------------------------------
    while (getline (ifs, line)) oss << line << '\n';
    string tmp(oss.str());
    if (!tmp.empty())
    {
      ifs.rdbuf()->sungetc ();
      if (ifs.rdbuf()->sgetc() != '\n') tmp.erase(tmp.size() - 1);
    }
    ofs << tmp;
    ------------------------------------------------

    ### CPP-10: std::getline, std::string, ostream::operator<<
    ------------------------------------------------
    while (getline (ifs, line))
    {
      str +=line;
      str +='\n';
    }
    if (!str.empty())
    {
      ifs.rdbuf()->sungetc ();
      if (ifs.rdbuf()->sgetc() != '\n') str.erase(str.size() - 1);
    }
    ofs << str;
    ------------------------------------------------

    ### CPP-11: istream::getline, std::ostringstream, ostream::operator<<
    ------------------------------------------------
    while (ifs.getline (const_buf, sizeof(const_buf)).gcount())
    {
      oss << const_buf;
      if (ifs.fail()) ifs.clear (~(ios_base::failbit | ~ifs.rdstate ()));
      else            oss << '\n';
    }
    string tmp(oss.str());
    if (!tmp.empty())
    {
      ifs.rdbuf()->sungetc ();
      if (ifs.rdbuf()->sgetc() != '\n') tmp.erase(tmp.size() - 1);
    }
    ofs << tmp;
    ------------------------------------------------

    ### CPP-12: istream::get(char) and ostream::put
    ------------------------------------------------
    while (ifs.get(ch)) ofs.put(ch);
    ------------------------------------------------

    ### CPP-13: istream::get(char)
    ------------------------------------------------
    for (unsigned long i = 0; ifs.get (ch); i++) str[i] = ch;
    str.erase (i);
    ofs << str;
    ------------------------------------------------

    ### CPP-14: istream::get(char*, streamsize), ostream::operator<< - with const size buffer
    ------------------------------------------------
    while (ifs.get (const_buf, sizeof(const_buf)))
    {
      ofs << const_buf;
      if (ifs.peek() == newline_int_symbol) ofs << char(ifs.get());
    }
    ------------------------------------------------

    ### CPP-15: istream::get(streambuf&)  and std::streambuf, ostream::operator<<
    ------------------------------------------------
    while (ifs.get (*ofs.rdbuf()))
    {
      if (ifs.peek() == newline_int_symbol) ofs << char(ifs.get());
    }
    ------------------------------------------------

    ### CPP-16: std::istream_iterator, std::ostream_iterator and std::copy
    ------------------------------------------------
    ifs >> noskipws;
    istream_iterator<char> in(ifs), eos;
    ostream_iterator<char> out(ofs);
    copy (in, eos, out);
    ------------------------------------------------

    ### CPP-17: std::istream_iterator, std::string
    ------------------------------------------------
    ifs >> noskipws;
    istream_iterator<char> in(ifs), eos;
    ofs << string(in, eos);
    ------------------------------------------------

    ### CPP-18: std::istreambuf_iterator, std::ostreambuf_iterator and std::copy
    ------------------------------------------------
    ifs >> noskipws;
    istreambuf_iterator<char> in(ifs), eos;
    ostreambuf_iterator<char> out(ofs);
    copy (in, eos, out);
    ------------------------------------------------

    ### CPP-19: std::istreambuf_iterator, std::ostreambuf_iterator and std::transform
    ------------------------------------------------
    ifs >> noskipws;
    istreambuf_iterator<char> in(ifs), eos;
    ostreambuf_iterator<char> out(ofs);
    transform(in, eos, out, char_identity());
    ------------------------------------------------

    ### CPP-20: std::istreambuf_iterator and std::string
    ------------------------------------------------
    ifs >> noskipws;
    istreambuf_iterator<char> in(ifs), eos;
    ofs << string(in, eos);
    ------------------------------------------------

    ### CPP-21: std::vector and std::copy
    ------------------------------------------------
    vector<char> v (no_of_file_bytes);
    ifs.read(&v[0], no_of_file_bytes);
    ostream_iterator<char> out(ofs);
    copy (&v[0], &v[v.size()], out);
    ------------------------------------------------

    ### CPP-22: std::vector and push_back()
    ------------------------------------------------
    vector<char> v;
    v.reserve(no_of_file_bytes);
    while (ifs.get(ch)) v.push_back(ch);
    ofs << (v.empty() ? string() : string (v.begin(), v.end()));
    ------------------------------------------------

    ### CPP-23: std::vector and istream::read()
    ------------------------------------------------
    vector<char> v (no_of_file_bytes);
    ifs.read(&v[0], no_of_file_bytes);
    ofs << (v.empty() ? string() : string (v.begin(), v.end()));
    ------------------------------------------------

    ### CPP-24: std::string and istream::read()
    ------------------------------------------------
    string tmp (no_of_file_bytes, '0');
    ifs.read(&tmp[0], no_of_file_bytes);
    ofs << tmp;
    ------------------------------------------------

===================== 4. Methods of copying : END =======================
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 14.2.2008, 11:08
Сообщение #4


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Не самый быстрый способ скопировать файл, это:
#include <unistd.h>
int link(const char *oldpath, const char *newpath);

:)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 14.2.2008, 12:04
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


это поди только для *nix'ов?
слово link, мозг щекочет :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Tonal
  опции профиля:
сообщение 14.2.2008, 20:02
Сообщение #6


Активный участник
***

Группа: Участник
Сообщений: 452
Регистрация: 6.12.2007
Из: Новосибирск
Пользователь №: 34

Спасибо сказали: 69 раз(а)




Репутация:   17  


Ага, для них родимых. :)
Ну а для винды есть аналог - CreateHardLink.

Правда и там и там есть ограничение - линкуються файлы в пределах одного раздела. :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrew Selivanov
  опции профиля:
сообщение 15.2.2008, 16:45
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 249
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 3

Спасибо сказали: 15 раз(а)




Репутация:   6  


Цитата(Tonal @ 14.2.2008, 20:02) *
Ага, для них родимых. :)
Ну а для винды есть аналог - CreateHardLink.

Правда и там и там есть ограничение - линкуються файлы в пределах одного раздела. :)

Насколько я понимаю понятие hard links довольно существенно отличается от понятия copy :)
Например, если я изменю файл оригинал... что произойдет с подлинкованными? :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 15.2.2008, 17:30
Сообщение #8


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Хард линк, собственно сам файл, например есть каталог
/user/local
на него, как и в любом другом каталоге, есть жесткая(хард) ссылка(линк)
./
так что это да! не копия!
хотя сим линк примерно тоже самое, для этого случая, изменив содержимое файла и модержимое симлинка тоже изменится
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Andrew Selivanov
  опции профиля:
сообщение 15.2.2008, 17:54
Сообщение #9


Участник
**

Группа: Участник
Сообщений: 249
Регистрация: 9.10.2007
Из: Москва
Пользователь №: 3

Спасибо сказали: 15 раз(а)




Репутация:   6  


Цитата(Litkevich Yuriy @ 15.2.2008, 17:30) *
Хард линк, собственно сам файл, например есть каталог
/user/local
на него, как и в любом другом каталоге, есть жесткая(хард) ссылка(линк)
./
так что это да! не копия!
хотя сим линк примерно тоже самое, для этого случая, изменив содержимое файла и модержимое симлинка тоже изменится


Я пробовал когда то junction points (виндовский аналог для симлинков) - просто монтировал один из хардов в папку на другом - получилось не особенно удобно, спустя несколько лет пришлось удалять, т.к. при вытаскивании хардов симлинки указывали в никуда... ляляля... фафафа... короче путаница вышла :)
Все же в *Nix и реализация и использование как то нативнее...

Кстати для интересующихся: создать хардлинк в винде можно так
FSUTIL hardlink create <new filename> <existing filename>
Eg : fsutil hardlink create c:\foo.txt c:\bar.txt

И ссылка на описание fsutil: http://www.ss64.com/nt/fsutil.html
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 15.2.2008, 18:09
Сообщение #10


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


я поплогаю линки(*nix'овые) и виндовоз вещи несовместимые, у win2k (и я думаю выше) есть понятие томов, там разные куски разделов (целые каталоги) можно сшивать в виртуальные каталоги (том в их понимании), что невозможно в GNU/Linux, вещь задумана хорошая, но эксперементировать на штатной системе боюсь.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 22.12.2024, 14:41