![]() |
1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным.
В описании темы указываем язык!!!
![]() ![]() |
![]() |
ninja |
![]()
Сообщение
#1
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 103 Пол: Мужской Реальное имя: Александр Репутация: ![]() ![]() ![]() |
Добрый вечер. Столкнулся с проблемой чтения/записи в файл. Задача в следующем: есть структура, ее необходимо записать в файл, а затем считать, причем запись может осуществляться несколько раз.
Записть организована следующим образом: 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);
При записи вроде все нормально, но когда читаю данные из файла появляется ошибка. Сообщение отредактировано: ninja - 18.09.2010 20:34 |
volvo |
![]()
Сообщение
#2
|
Гость ![]() |
Цитата При записи вроде все нормально, но когда читаю данные из файла появляется ошибка. Вот при записи и ошибка. Что такое 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 |
![]()
Сообщение
#3
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 103 Пол: Мужской Реальное имя: Александр Репутация: ![]() ![]() ![]() |
тоесть если я правильно понял нужно указать количество байт?
struct str
{
int m;
AnsiString vrt[20];
};
Или объявлять конкретный тип? вот так наверное будет правильней struct str
{
int m;
char vrt[20];
};
Сообщение отредактировано: ninja - 18.09.2010 21:28 |
ninja |
![]()
Сообщение
#4
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 103 Пол: Мужской Реальное имя: Александр Репутация: ![]() ![]() ![]() |
так тоже не верно...
я помню когда в delphi объявляется запись нужно указывать количество байт т.е. zapis = record
str: string[20]
end;
Сообщение отредактировано: ninja - 18.09.2010 21:47 |
volvo |
![]()
Сообщение
#5
|
Гость ![]() |
Цитата вот так наверное будет правильней Вот так действительно будет правильней. А еще лучше -struct str
{
int m;
TCHAR vrt[20]; // в неюникодном проекте будет char, в юникодном - wchar_t
};
Только заполнять такой массив надо будет по-другому, простое присваивание уже не пройдет. |
ninja |
![]()
Сообщение
#6
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 103 Пол: Мужской Реальное имя: Александр Репутация: ![]() ![]() ![]() |
Владимир, а заполнять массив просто обычным циклом? например:
struct str
{
int m;
TCHAR vrt[20];
};
struct str var;
for (int i = 0; i <= strlen(var.vrt); i++)
{
var.vrt[i] = 'q';
}
|
ninja |
![]()
Сообщение
#7
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 103 Пол: Мужской Реальное имя: Александр Репутация: ![]() ![]() ![]() |
Сделал, вроде все работает, но как то, если чесно криво я это реализрвал...
запись в файл: 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 Сообщение отредактировано: ninja - 18.09.2010 22:46 |
volvo |
![]()
Сообщение
#8
|
Гость ![]() |
// запись
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 |
![]()
Сообщение
#9
|
Пионер ![]() ![]() Группа: Пользователи Сообщений: 103 Пол: Мужской Реальное имя: Александр Репутация: ![]() ![]() ![]() |
Владимир, спасибо Вам большое все работает.
|
![]() ![]() |
![]() |
Текстовая версия | 10.08.2025 2:33 |