Помощь - Поиск - Пользователи - Календарь
Полная версия: Проблема при чтении/записи информации в файл
Форум «Всё о Паскале» > Delphi, Assembler и другие языки. > Другие языки
ninja
Добрый вечер. Столкнулся с проблемой чтения/записи в файл. Задача в следующем: есть структура, ее необходимо записать в файл, а затем считать, причем запись может осуществляться несколько раз.

Записть организована следующим образом:

struct str
{
int m;
AnsiString vrt;
};


struct str var;
FILE *F;

var.m = 1;
var.vrt = Edit2->Text;
F = fopen("file","ab+");

fwrite(&var,sizeof(struct str),1,F);
fclose(F);


Чтение:

struct str
{
int m;
AnsiString vrt;
};


struct str var;

FILE *F;
int i = 0;

F = fopen("file","rb");
while (!feof(F))
{
fseek(F,i*sizeof(struct varan),SEEK_SET);
fread(&var,sizeof(struct str),1,F);

Edit1->Text = "";
Edit1->Text = IntToStr(var.m);

Label1->Caption = var.vrt;
i++;
}


fclose(F);


При записи вроде все нормально, но когда читаю данные из файла появляется ошибка.
volvo
Цитата
При записи вроде все нормально, но когда читаю данные из файла появляется ошибка.
Вот при записи и ошибка. Что такое AnsiString? Это указатель. Попробуй запустить вот такой код:
void __fastcall TForm1::Button1Click(TObject *Sender)
{
struct str var;
FILE *F;
var.m = 1;
var.vrt = Edit2->Text;

ShowMessage(IntToStr((int)sizeof(struct str)));
F = fopen("file","ab+");
fwrite(&var,sizeof(struct str),1,F);
fclose(F);

}

, а в Edit2 запихай строку подлиннее, символов из 20-30. И что ты получишь в качестве размера struct var? 8 байт? А как целое число и строка длинной 20 символов затолкались в 8 байт? Очень просто: 4 байта - sizeof(int) и 4 байта размер указателя, который из себя и представляет тип AnsiString. Но при записи - ничего особо страшного, ну, записал ты значение указателя в файл - фиг бы с ним. А вот при чтении - облом. Ты прочел значение указателя, но...
Нажмите для просмотра прикрепленного файла
ninja
тоесть если я правильно понял нужно указать количество байт?

struct str
{
int m;
AnsiString vrt[20];
};


Или объявлять конкретный тип? вот так наверное будет правильней

struct str
{
int m;
char vrt[20];
};
ninja
так тоже не верно...

я помню когда в delphi объявляется запись нужно указывать количество байт т.е.

zapis = record
str: string[20]
end;
volvo
Цитата
вот так наверное будет правильней
Вот так действительно будет правильней. А еще лучше -
struct str
{
int m;
TCHAR vrt[20]; // в неюникодном проекте будет char, в юникодном - wchar_t
};

Только заполнять такой массив надо будет по-другому, простое присваивание уже не пройдет.
ninja
Владимир, а заполнять массив просто обычным циклом? например:

struct str
{
int m;
TCHAR vrt[20];
};

struct str var;

for (int i = 0; i <= strlen(var.vrt); i++)
{
var.vrt[i] = 'q';
}
ninja
Сделал, вроде все работает, но как то, если чесно криво я это реализрвал...

запись в файл:

struct str
{
int m;
TCHAR vrt[20];
};
struct str var;
FILE *F;
int i;

AnsiString str2 = Edit2->Text;
char *str = str2.c_str();

for (i = 0; i <= strlen(str); i++)
{
var.vrt[i] = str[i];
}
var.vrt[i-1] = '\0';

F = fopen("file","ab+");
fwrite(&var,sizeof(struct str),1,F);
fclose(F);


чтение:

struct str
{
int m;
TCHAR vrt[20];
};

struct str var;

FILE *F;
int i = 0;
char *ch;

F = fopen("file","rb");
while (!feof(F))
{
fseek(F,i*sizeof(struct str),SEEK_SET);
fread(&var,sizeof(struct str),1,F);
Edit1->Text = "";
ch = var.vrt;
Label1->Caption = ch;
i++;
}
fclose(F);




Появился 1 Warning: Comparing signed and unsigned values
volvo
// запись
void __fastcall TForm1::Button1Click(TObject *Sender)
{
struct str var;
FILE *F;
var.m = Edit2->Text.Length();
sprintf(var.vrt, "%s", Edit2->Text.t_str());

F = fopen("file","ab+");
fwrite(&var,sizeof(struct str),1,F);
fclose(F);

}

// чтение
void __fastcall TForm1::Button2Click(TObject *Sender)
{
struct str var;

FILE *F;
int i = 0;
F = fopen("file","rb");
while (!feof(F))
{
fseek(F,i*sizeof(struct str),SEEK_SET);
fread(&var,sizeof(struct str),1,F);

Edit1->Text = IntToStr(var.m);
AnsiString s = "";
s.printf("%s", var.vrt);
Label1->Caption = s;

i++;
}
fclose(F);
}

ninja
Владимир, спасибо Вам большое все работает.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.