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

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

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

open, close, write, read, lseek

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

Блин. Ну я не маленький все же. Уж такие вещи я точно знаю! ;) Конечно, это первое, что проверил! ;) Смещение в файле происходит! ;)
maint
Цитата(AD @ 17.4.2012, 16:41) *
Цитата(maint @ 17.4.2012, 11:30) *
для перезаписи O_RDWR. И проверять код возврата из lseek, как и из write. Может и не было смещения и записи

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

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

Вопрос, как мне казалось, не требовал кода. Уровень вопроса, на мой взгляд, подобен вопросу в предыдущей теме, когда можно подсказать без кода! Кол-во байт write возвращает правильное!
maint
#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
Цитата(maint @ 17.4.2012, 12:58) *
работает 100 пудов, только проверил. Пишет в начало файла
По-моему, у функции lseek параметры надо поменять местами. Вот так:
lseek(fd, 0L, SEEK_SET);


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

Блин. Ваш код проверил. Работает. У меня чего-то не удается. Буду разбираться!!!
maint
Цитата(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 все равно нулю равен. Проверил еще раз, тот же результат
AD
Цитата(maint @ 17.4.2012, 13:27) *
в первый аргумент вызова open(argv[1]). Сама программа argv[0]. Ага параметры ошибся. Но не принципиально. SEEK_SET все равно нулю равен. Проверил еще раз, тот же результат

Да-да. У меня тоже Ваш код работает. Понятно, что надо разбираться в коде, где-то накосячил! Спасибо.
Iron Bug
посмотри fsync и fdatasync.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.