Проблемы с записью в файл
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'
В чем проблема не понимаю
После того как я запишу данные в файл, а затем их считаю происходит искажение данных, это видно по текстовым переменным пропадают первые буквы, причем это происходит где то после третьей записи
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.
На этом мысли пока заканчиваются.
Запись в файл:
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];