crossplatform.ru

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

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


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

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

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




Репутация:   17  


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


Участник
**

Группа: Участник
Сообщений: 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
Сообщение #3


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

Группа: Участник
Сообщений: 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
Сообщение #4


Участник
**

Группа: Участник
Сообщений: 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
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
AD
  опции профиля:
сообщение 17.4.2012, 13:12
Сообщение #5


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

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

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




Репутация:   17  


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

Да-да. У меня тоже Ваш код работает. Понятно, что надо разбираться в коде, где-то накосячил! Спасибо.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


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


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




RSS Текстовая версия Сейчас: 29.11.2024, 5:20