|
23.08.2007, 16:16
|
#16
|
Знающий
Регистрация: 05.02.2007
Сообщений: 201
Написано одно полезное сообщение (для 2 участников)
|
Re: Алгоритм игры Lines
ОРИЕНТИРОВАНИЕ В ТЕКСТОВОМ ФАЙЛЕ Всем привет.
В любой программе часто возникает необходимость сохранять информацию на длительное время, что бы ее можно было воспроизвести при следующем запуске программы. Единственнымм способом сделать это является запись этой информации в файл. Но держать для каждой записи отдельный файл очень нерационально и для конечного пользователя и для программиста, который может просто запутаться, в каком файле что лежит.
Гораздо более рационально использовать один-два файла и в них хранить сразу много записей.
Информации записать в один файл можно сколько угодно много (до 32мб), а вот считать гораздо сожнее:
в паскале был отличный метод ориентирования в файле
Seek (f:file,pozitsia:integer);
Есть аналогичный метод и в С++, но там у функции fseek сразу три параметра: file,long,int.
C первым вопроса нет - это указатель на файл, в котором ориентироваться, а вот что такое второй и третий - не знаю (fseek не документирована ни в одной книге по С++, так как унаследована от С).
Может кто знает, как с попощью этой или какой нибудь другой функции ориентироваться в файле?
Функция fseek находится в файле stdio.h.
|
(Offline)
|
|
23.08.2007, 16:37
|
#17
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Re: Алгоритм игры Lines
по логике - это направление смещения ( от текущей позиции, начала или конца). Такие задчи я решаю при помощие fstream-класса. Показать?
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
23.08.2007, 16:49
|
#18
|
|
Re: Алгоритм игры Lines
|
|
|
23.08.2007, 17:57
|
#19
|
Знающий
Регистрация: 05.02.2007
Сообщений: 201
Написано одно полезное сообщение (для 2 участников)
|
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);
|
добавляет все элементы в одну строку списка, а не каждый элемент в свою.
|
(Offline)
|
|
23.08.2007, 18:17
|
#20
|
|
Re: Алгоритм игры Lines
Alex_90
если у тебя строчки по 50 символов то
st+=50 попробуй
|
|
|
23.08.2007, 22:10
|
#21
|
Знающий
Регистрация: 05.02.2007
Сообщений: 201
Написано одно полезное сообщение (для 2 участников)
|
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);
|
Однако толи он пробелы не добавляет, толи не считывает, но все равно следующие строчки он приплюсовывает к предыдущей. Пробывал даже вместо пробелов точки добавлять->все равно их не видно.
|
(Offline)
|
|
23.08.2007, 22:56
|
#22
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
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();
}
|
как-то так
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
23.08.2007, 23:30
|
#23
|
Знающий
Регистрация: 05.02.2007
Сообщений: 201
Написано одно полезное сообщение (для 2 участников)
|
Re: Алгоритм игры Lines
А возможно как-то наладить считывание так, что бы он считывал по принципу:
одна строчка в файле - один пункт в списке?
|
(Offline)
|
|
23.08.2007, 23:42
|
#24
|
Бывалый
Регистрация: 05.09.2005
Сообщений: 823
Написано 101 полезных сообщений (для 205 пользователей)
|
Re: Алгоритм игры Lines
Возможно. Есть такая функция - EOL(FILE*)
Возвращает true, если ты дошел до конца строки.
Насчет типа параметра не уверен, уточни.
|
(Offline)
|
|
24.08.2007, 00:33
|
#25
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Re: Алгоритм игры Lines
Сообщение от Alex_90
А возможно как-то наладить считывание так, что бы он считывал по принципу:
одна строчка в файле - один пункт в списке?
|
именно это мой пример и делает
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
24.08.2007, 23:46
|
#26
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Re: Алгоритм игры Lines
Сообщение от Alex_90
Вот интересная фигня получается:
Построчное считывание fstream работает и вполне нC
|
ась?
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
25.08.2007, 20:03
|
#27
|
Знающий
Регистрация: 05.02.2007
Сообщений: 201
Написано одно полезное сообщение (для 2 участников)
|
Re: Алгоритм игры Lines
В MFC незльзя создать переменную для текстового поля типа char*, который требуется для записи в файл функцией f_user.put (char*)
Придется переводить полученное из поля ввода значение типа CString в char*, но как?
Наверно, для этого есть какая-нибудь функция?
|
(Offline)
|
|
25.08.2007, 20:37
|
#28
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Re: Алгоритм игры Lines
Сообщение от Alex_90
В MFC незльзя создать переменную для текстового поля типа char*, который требуется для записи в файл функцией f_user.put (char*)
Придется переводить полученное из поля ввода значение типа CString в char*, но как?
Наверно, для этого есть какая-нибудь функция?
|
Брехня! Нормально char работает. Покажи код.
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
25.08.2007, 20:53
|
#29
|
Знающий
Регистрация: 05.02.2007
Сообщений: 201
Написано одно полезное сообщение (для 2 участников)
|
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'
|
|
(Offline)
|
|
25.08.2007, 20:58
|
#30
|
Зануда с интернетом
Регистрация: 04.09.2005
Сообщений: 14,014
Написано 6,798 полезных сообщений (для 20,935 пользователей)
|
Re: Алгоритм игры Lines
В MFC незльзя создать переменную для текстового поля типа char*
|
можно
--------------------
MB_OK|MB_ICONEXCLAMATION
-------------------
(LPTSTR)(LPCTSTR)Add_text юзай если уж так хочешь через CString
__________________
http://nabatchikov.com
Мир нужно делать лучше и чище. Иначе, зачем мы живем? tormoz
А я растила сына на преданьях
о принцах, троллях, потайных свиданьях,
погонях, похищениях невест.
Да кто же знал, что сказка душу съест?
|
(Offline)
|
|
Ваши права в разделе
|
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 17:58.
|