Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > И снова работа с файлами


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

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 и все. Как считать в буфер весь файл за один раз? Помогите, плиз!

Автор: vlarry 10.4.2012, 22:44
нашел метод readsome, считал весь файл в буфер, но когда открыл его, то увидел только "ННННННННННННННННННННННННННННННННННННННННННННН" и так весь файл. В чем прикол?

Автор: boostcoder 10.4.2012, 23:01
в коде все правильно, за исключением ненужных мелочей.
покажи полный код. или код воспроизводящий проблему.

Автор: vlarry 11.4.2012, 08:35
Вот две функции, в одной идет сканирование каталога и вснесение данных в 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();
}

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

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

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

Автор: vlarry 11.4.2012, 10:10
boostcoder, спасибо большое все работает!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)