LINUX.ORG.RU

Ошибка при простой записи в файл.


0

0

Проблема следующего плана. Пищу на диск много и долго: fopen(fd); for(много ~40000 раз){ fwrite(,sizeof(float),1,fd);} fclose(fd);.

Этот цикл(открытия,много записи, закрытия) повторяется 180 раз. И вроде когда инфы было меньше все работало. Но сейчас почему-то общий цикл на 60-м или около того разе обрывается, при этом пишется в файл какая-то хрень.

Вокруг еще файлы пишу но менее интенсивно, и там все Ок, и прога в целом работает правильно.

Вопрос. Где узнать как буфенизуется очередь записей и как может она переполниться, при этом не выдав никаких ошибок? Или в чем может быть проблема?

Данный просто не хотят писаться!

Заранее благодарен за любой совет.


А файл не превышает 2 гига? Если первышает, то будут проблемы. Надо юзать open с поддержкой больших файлов

Dead ★★★★
()

Нет даже все файлы целиком не превышают. Но много вызовов fwrite(); И я не указал. Конкретно этот файл всегда дописывается (fd=fopen(fname,"a");.

Xpeter
() автор топика

вобщем когда-то столкнулся с подобной проблемой.

для начала попробуй fflush, но это не решение в этом случае, хотя может помочь.

посмотри нет ли работы с массивом типа char buf[SIZE_OF_BUF];

если есть - юзай вместо него malloc - тогда таких проблем точно не будет, по крайней мере у меня они ушли.

anonymous
()

Массивов таких нет. И я использую new.

Xpeter
() автор топика

зачем мешаешь котлеты с мухами .. читай тред "C++" и пиши на C

lg ★★
()

Если что-то пишется, то откуда-то оно берется.
Либо проблемы непосредственно с записываемыми данными (вот тут
явно фрагмента программы не хватает, например, как описаны переменные, не передаются ли куда-либо "соседние" пременные по ссылки для вычислений и т.п., т.е. нет ли врага, который портит данные на проходе), либо какая-то подпрограмма явно шарашит по буферу.
Возможен: выход за пределы массива (ну нет массивов, так нет), некорректное использование создания/удаления объектов, как следствие возникновение висячих или дублированных ссылок и масса другого.
Кстати, что означает "цикл обрывается"? А точно ли для каждого файла выполняется fclose()? Не может ли оказаться, что одновременно открыто
масса файлов. В этом цикле ничего на ввод не открывается, закрываются ли входные файлы?
Обычно есть лимит на количество открытых одновременно файлов.

io ★★
()
Ответ на: комментарий от io

Проблема в том что прога раньше, например в Окнах работала. При переходе в линукс увеличились объёмы данных. Цикл обрывается это значит, что в файле место под даный выделяются, Прочитать файл можно, но то что записывается это мусор. Откуда он берется не понятно. Ничего ещё раз повторяю не менялось, кроме объема данных. Но спасибо за ответы. Я попробую локализовать ошибку. И тогда напишу. Просто весь код приводить плохо, он огромный 1500 строк.

Xpeter
() автор топика
Ответ на: комментарий от anonymous

>что произойдёт если слинковать прогу с efence и запустить? Насколько я помню, либа валит процесс в сигментэшн не когда он залазит в чужую память, а когда пытается нарушить границы выделенного динамически массива внутри своей памяти.

LegaT
()

вроде работает fwrite. правда странно? :)

делаем например так:
#include <stdio.h>
#include <stdlib.h>

static void Error(const char *s, int rc)
{
perror(s);
exit(rc);
}

int main(void)
{

int rc, i, cnt=100;
FILE *fp;
float tmp=3.14;

while(cnt--) {
fp=fopen("/tmp/out", "a+");
if(fp==NULL)
Error("fopen", 1);
for(i=0; i<1000000; i++) {
rc=fwrite(&tmp, sizeof(tmp), 1, fp);
if(rc!=1)
Error("fwrite", 1);
}
rc=fclose(fp);
if(rc!=0)
Error("fclose", 1);

}
return 0;
}

потом как-нибудь так:
gcc -Wall -ansi fwrite.c && time ./a.out && ls -l /tmp/out

real 0m19.099s
user 0m15.540s
sys 0m1.700s
-rw-r--r-- 1 ds ds 400000000 Mar 9 20:37 tmp/out

100 раз по 1е6 записей по 4 байта. 400метров. все сходится.
как видно никаких ошибок.

kernel 2.4.20


HTH

anonymous
()

вроде работает fwrite. правда странно? :)

делаем например так:
#include <stdio.h>
#include <stdlib.h>

static void Error(const char *s, int rc)
{
        perror(s);
        exit(rc);
}
        
int main(void) 
{

        int rc, i, cnt=100;
        FILE *fp;
        float tmp=3.14;
        
        while(cnt--) {
                fp=fopen("/tmp/out", "a+");
                if(fp==NULL) 
                        Error("fopen", 1);
                for(i=0; i<1000000; i++) {
                        rc=fwrite(&tmp, sizeof(tmp), 1, fp);
                        if(rc!=1)
                                Error("fwrite", 1);
                }
                rc=fclose(fp);
                if(rc!=0) 
                        Error("fclose", 1);
                
        }
        return 0;
}

потом как-нибудь так:
gcc -Wall -ansi fwrite.c && time ./a.out && ls -l /tmp/out 

real    0m19.099s
user    0m15.540s
sys     0m1.700s
-rw-r--r--    1 ds       ds       400000000 Mar  9 20:37 tmp/out

100 раз по 1е6 записей по 4 байта. 400метров. все сходится.
как видно никаких ошибок.

kernel 2.4.20


HTH

anonymous
()

извиняюсь за двойной пост. кто-то блин придумал user linebreaks.

anonymous
()

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

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.