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

Ваш аккаунт

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

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

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

Проблемы с записью в файл

1.9K
24 сентября 2003 года
Mistake
23 / / 14.01.2003
После того как я запишу данные в файл, а затем их считаю происходит искажение данных, это видно по текстовым переменным пропадают первые буквы, причем это происходит где то после третьей записи

typedef struct
{
int index;
AnsiString Name;
bool f;
AnsiString Attribute;
char a[2];
AnsiString file;
} TStruct;

Запись в файл:
FILE *f=fopen("Test","w");
if (f) {
for (int i=0;i<MyList->Count;i++)
{
temp1=(TStruct *) MyList->Items;
fwrite(&temp1->index,sizeof(int),1,f);
fwrite(temp1->Name.c_str(),sizeof(char[40]),1,f);
fwrite(&temp1->f,sizeof(bool),1,f);
fwrite(temp1->Attribute.c_str(),sizeof(char[40]),1,f);
fwrite(&temp1->a,sizeof(char[2]),1,f);
fwrite(temp1->file.c_str(),sizeof(char[40]),1,f);

}
fclose(f);
}


Чтение из файла:
MyList = new TList();
bool flag=true;
char buff[40];
FILE *f=fopen("Test","r");
if (f){
do
{
temp1=new TStruct();
if(fread(&temp1->index,sizeof(int),1,f)!=NULL)
{
fread(&buff,sizeof(char[40]),1,f);
temp1->Name=buff;
fread(&temp1->f,sizeof(bool),1,f);
fread(&buff,sizeof(char[40]),1,f);
temp1->Attribute=buff;
fread(&temp1->a,sizeof(char[2]),1,f);
fread(&buff,sizeof(char[40]),1,f);
temp1->file=buff;
MyList->Add(temp1);
}
else {flag=false; delete temp1;}
}
while (flag);
fclose(f);}
Еще одна интересная вещ, в которой по моему мнению может таится ошибка:
переманную a я заполняю таким образом в a[0]='A' a[1]='B' a[2]='\0'


В чем проблема не понимаю
315
24 сентября 2003 года
Nick_M
399 / / 29.05.2003
Цитата:
Originally posted by Mistake
После того как я запишу данные в файл, а затем их считаю происходит искажение данных, это видно по текстовым переменным пропадают первые буквы, причем это происходит где то после третьей записи

typedef struct
{
int index;
AnsiString Name;
bool f;
AnsiString Attribute;
char a[2];
AnsiString file;
} TStruct;

Запись в файл:
FILE *f=fopen("Test","w");
if (f) {
for (int i=0;i<MyList->Count;i++)
{
temp1=(TStruct *) MyList->Items;
fwrite(&temp1->index,sizeof(int),1,f);
fwrite(temp1->Name.c_str(),sizeof(char[40]),1,f);
fwrite(&temp1->f,sizeof(bool),1,f);
fwrite(temp1->Attribute.c_str(),sizeof(char[40]),1,f);
fwrite(&temp1->a,sizeof(char[2]),1,f);
fwrite(temp1->file.c_str(),sizeof(char[40]),1,f);

}
fclose(f);
}


Чтение из файла:
MyList = new TList();
bool flag=true;
char buff[40];
FILE *f=fopen("Test","r");
if (f){
do
{
temp1=new TStruct();
if(fread(&temp1->index,sizeof(int),1,f)!=NULL)
{
fread(&buff,sizeof(char[40]),1,f);
temp1->Name=buff;
fread(&temp1->f,sizeof(bool),1,f);
fread(&buff,sizeof(char[40]),1,f);
temp1->Attribute=buff;
fread(&temp1->a,sizeof(char[2]),1,f);
fread(&buff,sizeof(char[40]),1,f);
temp1->file=buff;
MyList->Add(temp1);
}
else {flag=false; delete temp1;}
}
while (flag);
fclose(f);}
Еще одна интересная вещ, в которой по моему мнению может таится ошибка:
переманную a я заполняю таким образом в a[0]='A' a[1]='B' a[2]='\0'


Несколько моментов, на которые я обратил внимание.
Массив a[] имеет размер в 2 символа, а заполняешь тремя?
Настоятельно рекомендую отказаться от типа AnsiString, а вместо него использовать массив символов и соответствующее преобразование.
Вместо sizeof(char[40]) спокойно можно использовать 40.
На этом мысли пока заканчиваются.

487
27 сентября 2003 года
ddnh_bc
301 / / 16.09.2003
Цитата:
Originally posted by Nick_M

Запись в файл:
FILE *f=fopen("Test","w");
if (f) {
for (int i=0;i<MyList->Count;i++)
{
temp1=(TStruct *) MyList->Items;
fwrite(&temp1->index,sizeof(int),1,f);
fwrite(temp1->Name.c_str(),sizeof(char[40]),1,f);
fwrite(&temp1->f,sizeof(bool),1,f);
fwrite(temp1->Attribute.c_str(),sizeof(char[40]),1,f);
fwrite(&temp1->a,sizeof(char[2]),1,f);
fwrite(temp1->file.c_str(),sizeof(char[40]),1,f);

}
fclose(f);
}



Пункт 1:
перед fclose(f) в функции записи данных файл неплохо было бы поставить fflush(f);
а файл открывать следующим образом:
FILE *f=fopen("Test","wb");


Пункт 2:
Для пущего удобству и плезиру, попробуй вместо записи через FILE воспользоваться классом TFileStream или TMemoryStream;

Пункт 3:
А строки Name Attribute и file у тебя не могут быть длиннее 39 символов?

Пункт 4:
И по-поводу a[2] действительно проверь - если ты заполняешь:
a[0]='A' a[1]='B' a[2]='\0' то тогда нужно ставить
не char a[2];, а char a[3];

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог