Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Добавление записи в файл


Автор: AlexeySheglov 3.6.2009, 11:51
кто разбирается, прошу помочь, не работает добавление записи в файл, вместо нее при выводе содержимого файла выводится третья запись во второй раз!
Код

#include <stdio.h>
#include <stdlib.h>
#define D 5
#define X 2
#define E 23
int main(){
struct rost {   
    char n[12];
    char k[3];
    int r;
} ro[X+1];
int a[D]={1,7,3,21,15};
int b[D]={5,12,4,22,20};
int i = 0;
FILE * f;
f = fopen( "D:\\bynary.txt", "a+b" );
for(i=0; i<D; i++){                                                                 //perestanovka zapisey
        fseek( f, (a[i]-1) * sizeof(rost)  , SEEK_SET );
        fread(&ro[0], sizeof(rost), 1, f);
        fseek( f, (b[i]-1) * sizeof(rost)  , SEEK_SET );
        fread(&ro[1], sizeof(rost), 1, f);
        fseek( f, (a[i]-1) * sizeof(rost)  , SEEK_SET );
        fwrite(&ro[1],sizeof(rost),1,f);
        fseek( f, (b[i]-1) * sizeof(rost)  , SEEK_SET );
        fwrite(&ro[0],sizeof(rost),1,f);
}
printf("Vv0d:");
scanf("%s %s %d", ro[X].n, ro[X].k, &ro[X].r ); //schityvane novoy zapisi
fseek(f, E*sizeof(rost) ,SEEK_SET); // ustanovka kursora  v konec fayla
fwrite(&ro[X], sizeof(rost),1,f); // dobavlenie zapisi v fail !!! REALNO ONA NE DOBAVLAETSYA Pochemu?
fseek(f,0,SEEK_SET); //v nachalo fayla
for(i=0; i<(E+1); i++){ /*schityvanie zapisey po 1-y i vyvod na ekran !!!NOVAYA ZAPIS` NE vyvoditsa
A VMESTO NEE VYVODITSA TRET`ya VTOROY rAZ!!*/ 
    fread(&ro[0], sizeof(rost), 1, f);
    printf("%s %s %d\n", ro[0].n, ro[0].k, ro[0].r);
}
fclose(f);
getchar();
getchar();
return 0;
}

ЗАРАНЕЕ СПАСИБО!

Автор: xvr 3.6.2009, 12:33
Вот это
Код

f = fopen( "D:\\bynary.txt", "a+b" );
открывает файл в режиме append, что заставляет его дописывать все в хвост, вне зависимости от того, куда был сделан fseek перед записью

Автор: AlexeySheglov 3.6.2009, 12:40
ну да, убрал fseek перед 30: fwrite(&ro[X], sizeof(rost),1,f);
НИЧЕГО НЕ ИЗМЕНИЛОСЬ.

Автор: zim22 3.6.2009, 12:44
Цитата(AlexeySheglov @  3.6.2009,  12:40 Найти цитируемый пост)
ну да, убрал fseek 

fseek ни при чём.
перечитайте ещё раз пост xvr

Автор: AlexeySheglov 3.6.2009, 12:48
изменил режим на w+b, выводит отрицательные вещественные числа 6-х порядков!
так в чем же дело. то, что в режиме a+b пишется в хвост понял, но в режиме w+b происходит усечение файла. КАК БЫТЬ?
файл-то нужно сохранить, но с нек-ми изменениями, причем сначала переставляются записи, а потом уже добвление в хвост?

Добавлено через 4 минуты и 8 секунд
УУУУУУУ. Спасибо. Дошло. Нужен режим r+b. Все работает норм.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)