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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> какие-то проблемы с созданием файлов 
:(
    Опции темы
SynthEtic
Дата 19.11.2006, 16:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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


Попытка решения: 
Я передаю в функцию имя файла, открываю его для чтения, создаю по нужному пути файл для записи, и затем посимвольно читаю/пишу...
но вот странная (для меня) ошибка - прочитываются все файлы полностью и записывается все полностью (проверено по размеру прочитанного и записанного), но: прочитывается 124 файла (как и должно быть), а создается только 36! Причем, самое интересное - то, что многие прочитанные файлы в записанном - сливаются в один! Т.е. в один файл записывается несколько... Привожу куски кода, как я это делаю... оба фрагмента у меня дают одинаковый результат...
Подскажите, в чем ошибка? Вроде все дескрипторы вовремя открываются и закрываются...
Сижу под Suse 10

Код: 

Код

int n;
    int fd_in = open(name.c_str(), O_RDONLY);
    int fd_out = open(out_path.c_str(), O_WRONLY | O_CREAT);
    
    char ch, buf[SIZE];
    
    while ((n = read(fd_in, buf, SIZE)) > 0)
        write(fd_out, buf, SIZE);


и так: 

Код

    ifstream in(name.c_str());
    ofstream out(out_path.c_str(), ios::app);
    char ch;
    
    while (!in.eof()) {
        in.get(ch);
                         out.put(ch);
    }
    
    out.close();
    in.close();

PM MAIL   Вверх
MAKCim
Дата 19.11.2006, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



SynthEtic
Код

while ((n = read(fd_in, buf, SIZE)) > 0)
        write(fd_out, buf, n);


Это сообщение отредактировал(а) MAKCim - 19.11.2006, 18:09


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
MAKCim
Дата 19.11.2006, 18:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата

Код

while ((n = read(fd_in, buf, SIZE)) > 0)
        write(fd_out, buf, SIZE);


это копирование файла?


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
GrayCardinal
Дата 19.11.2006, 21:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


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

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



Неплохо бы весь код на бочку. Конкретно в этих отрывках ошибок не вижу.  smile 


--------------------
PM MAIL WWW   Вверх
bilbobagginz
Дата 20.11.2006, 01:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

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



да думаю файлы иногда не только открывать надо... но и закрывать тоже..


--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
kirjanov
Дата 20.11.2006, 09:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 326
Регистрация: 22.1.2006
Где: Dark wood of erro r

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



зачем O_WRONLY | O_CREAT? O_CREAT создаст дескриптор для записи.
Код

while ((n = read(fd_in, buf, SIZE)) > 0)
        write(fd_out, buf, SIZE); //так тут бы лучше и записывать n байт

PM MAIL   Вверх
MAKCim
Дата 20.11.2006, 17:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Воін дZэна
****


Профиль
Группа: Экс. модератор
Сообщений: 5644
Регистрация: 10.12.2005
Где: Менск, РБ

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



Цитата

да думаю файлы иногда не только открывать надо... но и закрывать тоже.. 

Цитата

Подскажите, в чем ошибка? Вроде все дескрипторы вовремя открываются и закрываются...

кроме того по завершении процесса идет вызов exit_files(), которая закрывает все открытые файлы
Цитата

зачем O_WRONLY | O_CREAT? O_CREAT создаст дескриптор для записи.

Цитата

creat() is equivalent to open() with flags equal to O_CREAT | O_WRONLY | O_TRUNC

зачем тогда в man-е написан O_WRONLY

Это сообщение отредактировал(а) MAKCim - 20.11.2006, 17:27


--------------------
Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі ©

PM MAIL   Вверх
SynthEtic
Дата 21.11.2006, 17:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



MAKCim
Код


while ((n = read(fd_in, buf, SIZE)) > 0)
        write(fd_out, buf, SIZE);[code=cpp]

да, это копирование файла
fd_in - дескриптор читаемого файла
fd_out - дескриптор создаваемого файла

buf - массив char, длиной BUFSIZ - константа, определенная в <stdio.h> как оптимальный размер блока для ввода/вывода

kirjanov
я не совсем понял вопрос... зачем я ставлю эти флаги? - чтобы создать файл, если его не существует (а его не существует) и открыть его на запись... O_TRUNC и O_APPEND - не ставлю, так как для меня это не имеет значения - все равно новый файл - пустой, так что, что что транкэйт, что аппенд smile 

bilbobagginz
во втором варианте (с потоками) кода - дескрипторы закрываются smile а в первом - просто не скопировал сюда

GrayCardinal
собсна, это - функция:
Код

void someCopy(string name, string path) {
    int n;
    int fd_in = open(name.c_str(), O_RDONLY);
    int fd_out = open(out_path.c_str(), O_WRONLY | O_CREAT);
    char ch, buf[SIZE];
    
    while ((n = read(fd_in, buf, SIZE)) > 0)
        write(fd_out, buf, SIZE);

    close(fd_in);
    close(fd_out);
}


вызываемая внутри другой, которая определяет тип: 
Код

void TypeShow(dirent *dp, off_t size) {
    string file_name = dp->d_name;
    string extention, path;
    int pos = file_name.rfind(".", file_name.size()); 
    extention = file_name.substr(pos+1);
    if (extention == "html" || extention == "htm") {
        cout.setf(ios::left);
        cout.width(10);
        cout<<size<<"\tbytes\t";
        cout.width(30);
        cout<<dp->d_name;
        cout.width(21);
        cout<<"Type: HTML Document\t"<<get_current_dir_name()<<endl;
        html++;
        path = get_current_dir_name();
        someCopy(path, file_name);
            else if (extention == 'jpg')..... /*
                         никакой обработки - только вывод на экран размера и имени
                         и еще для нескольких других типов файлов
            */
}

которая вызывается при обходе директории:
Код

void View(DIR* dirp, char* path) {
    struct stat st;
    struct dirent *dp;
    chdir(path);
    
    for (dp = readdir(dirp); dp != NULL; dp = readdir(dirp)) {
        stat(dp->d_name, &st); // получаем имя первого элемента дерева
        // получаем аттрибуты файла
        if (S_ISDIR(st.st_mode)) {
            if (strcmp(dp->d_name, ".") != 0 &&  strcmp(dp->d_name, "..") != 0) {
                // Если файл является директорией, и при этом - не текущая директория
                // и не директория верхнего уровня (..) - показываем имя и входим
                cout<<"DIR\t\t\t"<<dp->d_name<<"\n------------------------------------------contains: "<<endl;
                View(opendir(dp->d_name), dp->d_name);
                chdir("../");
            }
            else    // выводим на экран директории "../" и "./"
                cout<<"DIR\t\t\t"<<dp->d_name<<endl;
        }
        else if (S_ISREG(st.st_mode)) {
            // Если файл - определяем его тип и инкрементируем счетчик файлов
            TypeShow(dp, st.st_size);
            total++;
        }
        // на каждой итерации происходит получение файла - обычного или директории
    }
}

PM MAIL   Вверх
Ignat
Дата 21.11.2006, 18:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Флудератор
****


Профиль
Группа: Экс. модератор
Сообщений: 4030
Регистрация: 19.4.2004
Где: غيليندزيك مدينة

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



SynthEtic, а что говорит strace по поводу дескрипторов?


--------------------
Теперь при чем :P
PM   Вверх
bilbobagginz
Дата 21.11.2006, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Naughtius Maximus
****


Профиль
Группа: Экс. модератор
Сообщений: 8813
Регистрация: 2.3.2004
Где: Israel

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



та ладно, кроме read и write  иногда и fflush надо делать (хотя-бы в DEBUG версии), для более чувственного отношения к работе:
Код

void someCopy(string name, string path) {
    int n;
    int fd_in = open(name.c_str(), O_RDONLY);
    int fd_out = open(out_path.c_str(), O_WRONLY | O_CREAT);/*что  [***]дь за out_path ты открываешь ?! */
    char ch, buf[SIZE];
    
    while ((n = read(fd_in, buf, SIZE)) > 0)
        write(fd_out, buf, SIZE);
    close(fd_in);
    close(fd_out);
}



--------------------
Я ещё не демон. Я только учусь.
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

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

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


 




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


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

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