crossplatform.ru

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

2 страниц V   1 2 >  
Ответить в данную темуНачать новую тему
> Перезапись уже созданного файла, как это сделать
AD
  опции профиля:
сообщение 17.4.2012, 9:27
Сообщение #1


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Стоит следующая задачка. Сделать кольцевой файл - наподобие кольцевого буфера. В принципе уже все сделал. Но есть одна проблема: я возвращаю счетчик позиции в начало файла, с помощью lseek перевожу на начало файла, но самой перезаписи не вижу. То есть в итоге получается файл, в котором в начале вижу то, что записал сначала, а перезаписи не вижу. Может ошибка в каких-то флагах? Все делается с помощью POSIX функций.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maint
  опции профиля:
сообщение 17.4.2012, 9:39
Сообщение #2


Участник
**

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

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




Репутация:   2  


Цитата(AD @ 17.4.2012, 15:27) *
Стоит следующая задачка. Сделать кольцевой файл - наподобие кольцевого буфера. В принципе уже все сделал. Но есть одна проблема: я возвращаю счетчик позиции в начало файла, с помощью lseek перевожу на начало файла, но самой перезаписи не вижу. То есть в итоге получается файл, в котором в начале вижу то, что записал сначала, а перезаписи не вижу. Может ошибка в каких-то флагах? Все делается с помощью POSIX функций.

с помощью каких POSIX функций ? От функций и флаги зависят
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 17.4.2012, 9:49
Сообщение #3


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Цитата(maint @ 17.4.2012, 10:39) *
с помощью каких POSIX функций ? От функций и флаги зависят

open, close, write, read, lseek
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maint
  опции профиля:
сообщение 17.4.2012, 10:30
Сообщение #4


Участник
**

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

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




Репутация:   2  


Цитата(AD @ 17.4.2012, 15:49) *
Цитата(maint @ 17.4.2012, 10:39) *
с помощью каких POSIX функций ? От функций и флаги зависят

open, close, write, read, lseek

для перезаписи O_RDWR. И проверять код возврата из lseek, как и из write. Может и не было смещения и записи
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 17.4.2012, 10:41
Сообщение #5


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Цитата(maint @ 17.4.2012, 11:30) *
для перезаписи O_RDWR. И проверять код возврата из lseek, как и из write. Может и не было смещения и записи

Блин. Ну я не маленький все же. Уж такие вещи я точно знаю! ;) Конечно, это первое, что проверил! ;) Смещение в файле происходит! ;)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maint
  опции профиля:
сообщение 17.4.2012, 11:07
Сообщение #6


Участник
**

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

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




Репутация:   2  


Цитата(AD @ 17.4.2012, 16:41) *
Цитата(maint @ 17.4.2012, 11:30) *
для перезаписи O_RDWR. И проверять код возврата из lseek, как и из write. Может и не было смещения и записи

Блин. Ну я не маленький все же. Уж такие вещи я точно знаю! ;) Конечно, это первое, что проверил! ;) Смещение в файле происходит! ;)

а что вы хотели что бы я нашел без текста программы ;). Была хохмочка в свое время, были отличия у open у фряхи и линуха. Но на другом уровне, на fopen. fsync можно попробовать. Но если close выполняется, по моему бессмысленно. Как и setbuf. Все же хочу спросить write возвращает именно нужное кол-во записанных байт ?

Сообщение отредактировал maint - 17.4.2012, 11:08
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 17.4.2012, 11:25
Сообщение #7


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Цитата(maint @ 17.4.2012, 12:07) *
а что вы хотели что бы я нашел без текста программы ;). Была хохмочка в свое время, были отличия у open у фряхи и линуха. Но на другом уровне, на fopen. fsync можно попробовать. Но если close выполняется, по моему бессмысленно. Как и setbuf. Все же хочу спросить write возвращает именно нужное кол-во записанных байт ?

Вопрос, как мне казалось, не требовал кода. Уровень вопроса, на мой взгляд, подобен вопросу в предыдущей теме, когда можно подсказать без кода! Кол-во байт write возвращает правильное!

Сообщение отредактировал AD - 17.4.2012, 11:28
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maint
  опции профиля:
сообщение 17.4.2012, 11:58
Сообщение #8


Участник
**

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

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




Репутация:   2  


#include <stdio.h>
#include <string.h>
#include <fcntl.h>
#include <unistd.h>

int main(int argc, char *argv[])
{

    int fd;
    int n_write;
    int n_read;
    char buf[4096];

    if((fd = open(argv[1], O_RDWR)) < 0) return 1;
    while((n_read = read(fd, buf, 4096)) > 0)
       ;
    lseek(fd, SEEK_SET, 0L);
    strcpy(buf, "111111111111111");
    n_write = write(fd, buf, strlen(buf));
    printf("n_write %d\n", n_write);
    close(fd);

    return 0;
}

работает 100 пудов, только проверил. Пишет в начало файла
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 17.4.2012, 12:24
Сообщение #9


Профессионал
*****

Группа: Участник
Сообщений: 2003
Регистрация: 4.2.2008
Из: S-Petersburg
Пользователь №: 84

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




Репутация:   17  


Цитата(maint @ 17.4.2012, 12:58) *
работает 100 пудов, только проверил. Пишет в начало файла
По-моему, у функции lseek параметры надо поменять местами. Вот так:
lseek(fd, 0L, SEEK_SET);


А куда Вы пишете? В файл самой программы что-ли? А.... Понял....

Блин. Ваш код проверил. Работает. У меня чего-то не удается. Буду разбираться!!!

Сообщение отредактировал AD - 17.4.2012, 12:13
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
maint
  опции профиля:
сообщение 17.4.2012, 12:27
Сообщение #10


Участник
**

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

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




Репутация:   2  


Цитата(AD @ 17.4.2012, 18:24) *
Цитата(maint @ 17.4.2012, 12:58) *
работает 100 пудов, только проверил. Пишет в начало файла
По-моему, у функции lseek параметры надо поменять местами. Вот так:
lseek(fd, 0L, SEEK_SET);


А куда Вы пишете? В файл самой программы что-ли? А.... Понял....

Блин. Ваш код проверил. Работает. У меня чего-то не удается. Буду разбираться!!!

в первый аргумент вызова open(argv[1]). Сама программа argv[0]. Ага параметры ошибся. Но не принципиально. SEEK_SET все равно нулю равен. Проверил еще раз, тот же результат

Сообщение отредактировал maint - 17.4.2012, 12:30
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

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


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




RSS Текстовая версия Сейчас: 20.4.2024, 7:09