Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Как писать в любое место в файл?

17K
07 декабря 2006 года
Sourcer
7 / / 26.10.2006
Как писать в любое место в файл? Я открываю FILE* fp=fopen(filename,"a+");читаю и позиционируюсь в начало файла. Но пишется только в конец файла. Нужно, чтобы это все на чистом Си.
63
07 декабря 2006 года
Zorkus
2.6K / / 04.11.2006
А почему бы не использовать файловые потоки? fstream?
17K
07 декабря 2006 года
Sourcer
7 / / 26.10.2006
Тогда другой вопрос. Как мне вставить в начало файла каие-либо данные, не используя вспомогательный фаил? Есть 1 вариант: грузить данный фаил в динамический массив, а потом записать все, что нужно и уж после переписать все из массива обратно в фаил . Еще вариант могут быть?
Да, забыл, мне нужно писать все на чистом СИ.
547
08 декабря 2006 года
Hydra
488 / / 20.06.2006
Попоробуй после открытия перейти в конец файла, только потом в позицию для записи. Возможно после первого перехода надо будет сделать fflush()
240
08 декабря 2006 года
aks
2.5K / / 14.07.2006
Цитата: Zorkus
А почему бы не использовать файловые потоки? fstream?



потому что

Цитата: Sourcer
Нужно, чтобы это все на чистом Си.



Кстати как позиционируешся в начало, приведи код.

5.9K
08 декабря 2006 года
Zushenskiy
161 / / 29.06.2006
Код:
fstream io("111.txt", ios::ate | ios::out | ios::in);
    char ch = 0;
    char szNewStr[] = "new world";
    int iKol = (int)strlen(szNewStr);
    int iPos = io.tellg();
    while(iPos-- > 0)
    {
        io.seekg(iPos, ios::beg);
        io>>ch;
        io.seekg(iPos + iKol, ios::beg);
        io<<ch;
    }
    io.seekg(0, ios::beg);
    io<<szNewStr;
    io.close();
398
08 декабря 2006 года
Alexandoros
630 / / 21.10.2005
fseek
17K
08 декабря 2006 года
Sourcer
7 / / 26.10.2006
Я делаю так:
int p=123;
FILE* fp=fopen(filename,"a+");
fseek(fp,0l,SEEK_SET);
fwrite(&p,sizeof(p),1,fp);
fclose(fp);

Но пишется в конец файла.Если открывать файл с "r+" вместо "a+", то размер файла не увеличивается, но писать могу куда угодно.
Вообще моя задача состоит в том, чтобы в начало записать массив файловых указателей на строки в файле. Поэтому мне нужно организовать сдвиг содержимого файла на длину массива, следовательно размер файла увеличится.
Повторюсь, что писать мне нужно на чистом Си.
395
08 декабря 2006 года
RelB
367 / / 09.11.2002
Цитата: Sourcer
Я делаю так:
int p=123;
FILE* fp=fopen(filename,"a+");
fseek(fp,0l,SEEK_SET);
fwrite(&p,sizeof(p),1,fp);
fclose(fp);

Но пишется в конец файла.Если открывать файл с "r+" вместо "a+", то размер файла не увеличивается, но писать могу куда угодно.
Вообще моя задача состоит в том, чтобы в начало записать массив файловых указателей на строки в файле. Поэтому мне нужно организовать сдвиг содержимого файла на длину массива, следовательно размер файла увеличится.
Повторюсь, что писать мне нужно на чистом Си.

Хм, при r+ размер меняется если при записи ты выходишь за границы файла.
В твоем случае, ничего не остается как "вручную развигать" файл, что не есть гуд если файл большой. Как я понял, ты хочешь реализовать что-то типа индекса. Тогда не проще ли создать отдельный файл индексов, где хранятся указатели на строки в твоем файле?

5.9K
08 декабря 2006 года
Zushenskiy
161 / / 29.06.2006
Код:
FILE *file = fopen("111.txt", "r+");
    int iPos;
    char ch1 = 0;
    char ch2 = 0;
    bool bFinish = false;
    char szNewStr[] = "new world";
    int iKol = iPos = (int)strlen(szNewStr);
    do{
        if (ch2 == EOF)bFinish = true;
        for (int i = 0; i < iKol; i++)
        {
            fseek(file, i, SEEK_SET);
            ch1 = fgetc(file);
                         fseek(file, iPos + i, SEEK_SET);
            ch2 = fgetc(file);
            if (ch1 != EOF)
            {
                fseek(file, iPos + i, SEEK_SET);
                fputc(ch1, file);
            }
            fseek(file, i, SEEK_SET);
            fputc(ch2, file);
        }
        iPos += iKol;
    }while(!bFinish);
    rewind(file);
    fprintf(file, "%s", szNewStr);
    fclose(file);


вот на чистом си. я правда непомню но вроде в си нет функции получения размера файла, если бы была такова, код был бы меньше, по аналогии с моим придыдущим примером
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог