Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> И снова работа с файлами 
V
    Опции темы
vlarry
Дата 10.4.2012, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



Добрый вечер, форумчане! Появилась необходимость написать свой упаковщик файлов, и наткнулся на такую проблему. Не могу считать данные из файла в буфер...Сколько ни бьюсь все не получается:). Делаю так:
Код

fstream out("d:\\image\\image.dat", ios::out|ios::binary);
fstream in(d:\\image\\image.jpeg, ios::in|ios::binary);
char *buffer = new char[size];
in.read(buffer, size);
out.write(buffer, size);
in.close();
out.close();

Понятно что здесь пропущены многие фрагменты, но думаю и так понятно. Только вот проблема в том, что в файл записывается строка до первого NUL и все. Как считать в буфер весь файл за один раз? Помогите, плиз!
PM MAIL   Вверх
vlarry
Дата 10.4.2012, 22:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



нашел метод readsome, считал весь файл в буфер, но когда открыл его, то увидел только "ННННННННННННННННННННННННННННННННННННННННННННН" и так весь файл. В чем прикол?
PM MAIL   Вверх
boostcoder
Дата 10.4.2012, 23:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



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

PM WWW   Вверх
vlarry
Дата 11.4.2012, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



Вот две функции, в одной идет сканирование каталога и вснесение данных в stl::list о найденных файлах, а вторая производит запись в файл
Код

bool scanDirectory(const char *path, std::list<FILEINFO> &pack)
{
    _finddata_t c_file;
    intptr_t   hfile;

    char *mask = "*.*";
    char path_file[255];

    strcpy(path_file, path);
    strncat(path_file, "/", strlen("/"));
    strncat(path_file, mask, strlen(mask));
    
    path_file[strlen(path_file)] = '\0';

    if((hfile = _findfirst(path_file, &c_file)) == -1L)
        return false;
    else
    {
        do
        {
            if(strcmp(c_file.name, ".") == 0 || strcmp(c_file.name, "..") == 0)
                continue;

            if(c_file.attrib & _A_SUBDIR)
            {
                path_file[0] = '\0';
                strcpy(path_file, path);
                strncat(path_file, "/", strlen("/"));
                strncat(path_file, c_file.name, strlen(c_file.name));
                path_file[strlen(path_file)] = '\0';

                scanDirectory(path_file, pack);
            }
            else
                if(c_file.attrib & (_A_RDONLY | _A_HIDDEN | _A_SYSTEM | _A_ARCH))
                {
                    FILEINFO fileinfo;

                    int size_path = strlen(path) + 1;
                    
                    fileinfo.path = new char[size_path];
                    
                    if(!fileinfo.path)
                        printf("Can't selected a memory!!!\n");

                    strcpy(fileinfo.path, path);
                    strcat(fileinfo.path, "/");

                    fileinfo.path[size_path] = '\0';

                    int lenght_name = strlen(c_file.name) + 1;
                    fileinfo.name = new char[lenght_name];
                    strcpy(fileinfo.name, c_file.name);
                    fileinfo.name[lenght_name] = '\0';

                    fileinfo.size = c_file.size;

                    pack.push_back(fileinfo);
                }
        }while(!_findnext(hfile, &c_file));

        _findclose(hfile);
    }

    return true;
}
//--------------------------------------------------------
void savePack(const char *path_src, const char *path_dest)
{
    std::list<FILEINFO> pack; // упаковка

    scanDirectory(path_src, pack);

    std::fstream out(path_dest, std::ios::binary|std::ios::out);

    out << "WFLS";

    std::list<FILEINFO>::iterator iterator;
    
    int check_sum = 0;

    for(iterator = pack.begin(); iterator != pack.end(); ++iterator)
    {
        char buffer[255];

        strcpy(buffer, iterator->path + 3);
        buffer[strlen(iterator->path) - 3] = '\0';

        out << strlen(buffer) << buffer;
        out << strlen(iterator->name) << iterator->name;

        printf("size = %d\n", iterator->size);

        unsigned char *data = new unsigned char[iterator->size];

        char file[255];
        strcpy(file, iterator->path);
        strcat(file, iterator->name);
        file[strlen(file) + 1] = '\0';

        std::fstream in(file, std::ios::in|std::ios::binary);

        in.read(reinterpret_cast<char*>(data), iterator->size);
        data[iterator->size] = 0;

        out << iterator->size << data;

        in.close();

        check_sum += sizeof(strlen(buffer)) + strlen(buffer);
        check_sum += sizeof(strlen(iterator->name)) + strlen(iterator->name);
        check_sum += sizeof(iterator->size) + iterator->size;
    }

    check_sum += sizeof(check_sum);

    out << check_sum;

    out.close();
}

PM MAIL   Вверх
boostcoder
Дата 11.4.2012, 09:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(vlarry @  11.4.2012,  08:35 Найти цитируемый пост)
out << iterator->size << data;

оператор вывода в поток, даже если поток бинарный, выводит в текстовом виде.

замени все операции типа 'out << ...' на 'out.write(...)'

PM WWW   Вверх
vlarry
Дата 11.4.2012, 10:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 153
Регистрация: 16.8.2009

Репутация: нет
Всего: нет



boostcoder, спасибо большое все работает!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0890 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.