IPB
ЛогинПароль:

> Внимание!

1. Пользуйтесь тегами кода. - [code] ... [/code]
2. Точно указывайте язык, название и версию компилятора (интерпретатора).
3. Название темы должно быть информативным. В описании темы указываем язык!!!

 
 Ответить  Открыть новую тему 
> Проблема при чтении/записи информации в файл, C++ Builder
ninja
сообщение 18.09.2010 20:33
Сообщение #1


Пионер
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


Добрый вечер. Столкнулся с проблемой чтения/записи в файл. Задача в следующем: есть структура, ее необходимо записать в файл, а затем считать, причем запись может осуществляться несколько раз.

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

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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 18.09.2010 20:55
Сообщение #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
сообщение 18.09.2010 21:04
Сообщение #3


Пионер
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


тоесть если я правильно понял нужно указать количество байт?

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


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

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


Сообщение отредактировано: ninja - 18.09.2010 21:28
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
ninja
сообщение 18.09.2010 21:46
Сообщение #4


Пионер
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


так тоже не верно...

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

zapis = record
           str: string[20]
           end;


Сообщение отредактировано: ninja - 18.09.2010 21:47
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 18.09.2010 21:51
Сообщение #5


Гость






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

Только заполнять такой массив надо будет по-другому, простое присваивание уже не пройдет.
 К началу страницы 
+ Ответить 
ninja
сообщение 18.09.2010 22:05
Сообщение #6


Пионер
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


Владимир, а заполнять массив просто обычным циклом? например:

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

struct str var;

for (int i = 0; i <= strlen(var.vrt); i++)
	{
		var.vrt[i] = 'q';
	}
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
ninja
сообщение 18.09.2010 22:42
Сообщение #7


Пионер
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


Сделал, вроде все работает, но как то, если чесно криво я это реализрвал...

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

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
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
volvo
сообщение 19.09.2010 0:01
Сообщение #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
сообщение 19.09.2010 11:49
Сообщение #9


Пионер
**

Группа: Пользователи
Сообщений: 103
Пол: Мужской
Реальное имя: Александр

Репутация: -  0  +


Владимир, спасибо Вам большое все работает.
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 

- Текстовая версия 10.08.2025 2:33
Хостинг предоставлен компанией "Веб Сервис Центр" при поддержке компании "ДокЛаб"