forum.boolean.name

forum.boolean.name (http://forum.boolean.name/index.php)
-   C++ (http://forum.boolean.name/forumdisplay.php?f=22)
-   -   Алгоритм игры Lines (http://forum.boolean.name/showthread.php?t=3896)

Alex_90 23.08.2007 16:16

Re: Алгоритм игры Lines
 
ОРИЕНТИРОВАНИЕ В ТЕКСТОВОМ ФАЙЛЕ
Всем привет.
В любой программе часто возникает необходимость сохранять информацию на длительное время, что бы ее можно было воспроизвести при следующем запуске программы. Единственнымм способом сделать это является запись этой информации в файл. Но держать для каждой записи отдельный файл очень нерационально и для конечного пользователя и для программиста, который может просто запутаться, в каком файле что лежит.
Гораздо более рационально использовать один-два файла и в них хранить сразу много записей.
Информации записать в один файл можно сколько угодно много (до 32мб), а вот считать гораздо сожнее:
в паскале был отличный метод ориентирования в файле
Seek (f:file,pozitsia:integer);
Есть аналогичный метод и в С++, но там у функции fseek сразу три параметра: file,long,int.
C первым вопроса нет - это указатель на файл, в котором ориентироваться, а вот что такое второй и третий - не знаю (fseek не документирована ни в одной книге по С++, так как унаследована от С).
Может кто знает, как с попощью этой или какой нибудь другой функции ориентироваться в файле?
Функция fseek находится в файле stdio.h.:)

impersonalis 23.08.2007 16:37

Re: Алгоритм игры Lines
 
по логике - это направление смещения ( от текущей позиции, начала или конца). Такие задчи я решаю при помощие fstream-класса. Показать?

jimon 23.08.2007 16:49

Re: Алгоритм игры Lines
 
вводим в гугл "fseek c++" и читаем мануал :
http://www.cplusplus.com/reference/c...dio/fseek.html

Alex_90 23.08.2007 17:57

Re: Алгоритм игры Lines
 
Цитата:

по логике - это направление смещения ( от текущей позиции, начала или конца). Такие задчи я решаю при помощие fstream-класса. Показать?
Если можно, то да, потому что моя конструкция
Цитата:

Spisok_control.ResetContent ();
//Выводим в список все имена пользователей из расчета одна строка
//в файле - один пользователь
FILE *f_user;
char* FileNameUser="Users.lin";
char load_string [50] = "none";
f_user=fopen (FileNameUser,"r");
long st=0;
while (!feof(f_user))
{
fseek (f_user,st,SEEK_SET);
fgets( load_string, 50 , f_user);
Spisok_control.AddString (load_string);
st++;
}
fclose (f_user);
добавляет все элементы в одну строку списка, а не каждый элемент в свою.

jimon 23.08.2007 18:17

Re: Алгоритм игры Lines
 
Alex_90
если у тебя строчки по 50 символов то
st+=50 попробуй

Alex_90 23.08.2007 22:10

Re: Алгоритм игры Lines
 
Цитата:

Alex_90
если у тебя строчки по 50 символов то
st+=50 попробуй

Проверил->Ни какого результата.
Все равно он все строчки в одну считывает.Ведь у меня строчки с именами игроков могут быть от 1 до 50 символов, причем, если строчка меньше 50 символов, то до 50 я добавляю пробелами:
Цитата:

//Теперь надо дабавть нового игрока в список игроков и соддать
//для него список его рекордов
FILE *f_user,*f_records;
char* FileNameUser="Users.lin";
//char* FileNameRecords=Add_text+".lin";
f_user=fopen (FileNameUser,"a");
//f_records=fopen (FileNameRecords,"w");
//Файл рекордов создан и открыт, но записывать туда будет другая
//программа, поэтому сразу этот файл ззакрываем
//fclose (f_records);
fputs (Add_text,f_user);
//Дополняем строку пробелами до 50 символов
int pr;
pr=50-Add_text.GetLength ();
for (int i=1;i==pr;i++)
{
fputs (".",f_user);
}
fclose (f_user);
Однако толи он пробелы не добавляет, толи не считывает, но все равно следующие строчки он приплюсовывает к предыдущей. Пробывал даже вместо пробелов точки добавлять->все равно их не видно.

impersonalis 23.08.2007 22:56

Re: Алгоритм игры Lines
 
Цитата:

#include<fstream.h>
#include<iostream.h>
#include<conio.h>


void main(){
fstream file;
file.open("score.txt",ios::in|ios::nocreate);
if(!file.is_open()){
cout<<"cannot open!"<<endl;
getch();
return;
}
char load_string [50];
while(!file.eof()){
file>>load_string;
cout<<load_string<<endl;
}
file.close();
getch();
}
как-то так

Alex_90 23.08.2007 23:30

Re: Алгоритм игры Lines
 
А возможно как-то наладить считывание так, что бы он считывал по принципу:
одна строчка в файле - один пункт в списке?

Magus 23.08.2007 23:42

Re: Алгоритм игры Lines
 
Возможно. Есть такая функция - EOL(FILE*)
Возвращает true, если ты дошел до конца строки.
Насчет типа параметра не уверен, уточни.

impersonalis 24.08.2007 00:33

Re: Алгоритм игры Lines
 
Цитата:

Сообщение от Alex_90
А возможно как-то наладить считывание так, что бы он считывал по принципу:
одна строчка в файле - один пункт в списке?

именно это мой пример и делает

impersonalis 24.08.2007 23:46

Re: Алгоритм игры Lines
 
Цитата:

Сообщение от Alex_90
Вот интересная фигня получается:

Построчное считывание fstream работает и вполне нC

:4to: ась?

Alex_90 25.08.2007 20:03

Re: Алгоритм игры Lines
 
В MFC незльзя создать переменную для текстового поля типа char*, который требуется для записи в файл функцией f_user.put (char*)
Придется переводить полученное из поля ввода значение типа CString в char*, но как?
Наверно, для этого есть какая-нибудь функция?:)

impersonalis 25.08.2007 20:37

Re: Алгоритм игры Lines
 
Цитата:

Сообщение от Alex_90
В MFC незльзя создать переменную для текстового поля типа char*, который требуется для записи в файл функцией f_user.put (char*)
Придется переводить полученное из поля ввода значение типа CString в char*, но как?
Наверно, для этого есть какая-нибудь функция?:)

Брехня! Нормально char работает. Покажи код.

Alex_90 25.08.2007 20:53

Re: Алгоритм игры Lines
 
Цитата:

void Add_user::OnAdd()
{
UpdateData (true);
if (Add_text.GetLength ()>50)
{
AfxMessageBox ("Такое имя без поллитра не прочтешь, а если и прочтешь, то я язык сломаешь! Введите имя не более 50 символов в длину.",MB_OK+MB_ICONEXCLAMATION,0);
}
if (Add_text.GetLength()!=0&&Add_text.GetLength ()<=50)
{
// TODO: Add your control notification handler code here
//Теперь надо дабавть нового игрока в список игроков и соддать
//для него список его рекордов
fstream f_user,f_records;
f_user.open ("Users.lin",ios::in);
f_user.put (Add_text);//Ошибка выдается здесь
f_user.close ();
CDialog::OnOK();
}
if (Add_text.GetLength ()==0)
{
AfxMessageBox ("Инкогнитые из Питербурга к игре не допускаются! Все таки имя ввсести придется!",MB_OK+MB_ICONEXCLAMATION,0);
}
}
Перменная Add_text связанна с полем ввода и имеет тип CString.
Ошибка, которую выдает Visual Studio:
Цитата:

C:\Мои документы\Программирование\Visual C++\OpenGL\User\Add_user.cpp(61) : error C2664: 'class ostream &__thiscall ostream::put(char)' : cannot convert parameter 1 from 'class CString' to 'char'

impersonalis 25.08.2007 20:58

Re: Алгоритм игры Lines
 
Цитата:

В MFC незльзя создать переменную для текстового поля типа char*
можно
--------------------
Цитата:

MB_OK+MB_ICONEXCLAMATION
MB_OK|MB_ICONEXCLAMATION
-------------------
(LPTSTR)(LPCTSTR)Add_text юзай если уж так хочешь через CString


Часовой пояс GMT +4, время: 06:17.

vBulletin® Version 3.6.5.
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Перевод: zCarot