Войти

Показать полную графическую версию : Записать переменую в файл


Страниц : [1] 2

DENoszone
29-06-2008, 11:32
кратко: я хочу что бы пользователь выберал управление.
в опциях человек может выбрать какая клавиша отвечается за верх какая за них и так далее...
надо что бы код клавишы записывался в тхт файл.
вид файла:
77 // клавиша вверх
79 // клавиша в низ


и так далее.

ну потом считывать с файла тоже помогите...просто не сильно дружу с файлами и что то не получается.

Admiral
30-06-2008, 05:27
Запись.
#include <stdio.h>

int main(int argc, char* argv[])
{
int keyCode;char *keyName;
FILE *fSettings;
if ((fSettings = fopen("MyAppKey.txt","w"))!=NULL)
{
keyCode=77;keyName=" // key DOWN";
fprintf(fSettings, "%i%s\n",keyCode,keyName);// клавиша вверх
keyCode=79;keyName=" // key UP";
fprintf(fSettings, "%i%s\n",keyCode,keyName); // клавиша в низ
fclose(fSettings);
}
else
printf("Error file operation.");

return 0;
}
Я б порекомендовал в части записи разделять не //, что интерпретируется как часть символа, а с помощью записи через \t, что значит пробел. То есть так
/*...*/
keyCode=77;keyName="key DOWN";
fprintf(fSettings, "%i \t %s\n",keyCode,keyName);// клавиша вверх
/*...*/
А вот насчёт чтения такой структуры могут быть проблемы.
Сама процедура чтения не вызывает особых отличий, от процедуры получения данных переменных, единственное что указывается ещё имя потока открытого файла
/*...*/
if ((fSettings = fopen("MyAppKey.txt","r"))!=NULL)
{
/*Внимание! Этот код закомментирован и требует доработки
while (!feof(fSettings))
{
fscanf(fSettings, "%i \t %s\n", &keyCode, &keyName);//
printf("\n%i %s", keyCode, keyName);
}
Внимание! Этот код закомментирован и требует доработки.
Он лишь показывает идею считывания, а не её реализацию */
}
/*...*/

DENoszone
30-06-2008, 12:02
отлично.
while (!feof(fSettings)) - !feof - не знаю такой команды.
когда я писал // я расчитывал что вы поймете как комент просто ...
в коде файла можно обойтись без него..
я хочу вообще закодить в двоичный что бы не льзя было изменять в файле.

кстати хочу сразу сюданаписать..
есть варианты делать подсчет времени (засекание) без 2 потока?

DENoszone
01-07-2008, 01:23
вот вопрос...как мне записывать в 1 строчку...а другое во второй

DENoszone
01-07-2008, 01:53
и ещё как избежать ввода клавиши которые не отлавливаются???
типо ctrl ?

Admiral
01-07-2008, 14:33
DENoszone
Если компилятор с прошлой темы (http://forum.oszone.net/thread-108817.html) не менялся то команда feof (http://msdn.microsoft.com/en-us/library/xssktc6e(VS.71).aspx) входит в заголовочный файл stdio.h, а /*...*/ в примере означает брать шапку и окончание с первого примера поста. Символ ! перед ней означает отрицание, а строчка кода while (!feof(fSettings)) означает "пока не найден конец файла".

Закодировать и/или работать в двоичном режиме?
Закодировать самым примитивным способом можно указывая соответствующие коды символов согласно кодовой таблицы. Character Tables (http://msdn.microsoft.com/en-us/library/ms947792.aspx)
Двоичныё режим это соответственный режим чтения/записи файла, в котором всё может и оставаться по прежнему.

Насчёт запрет на изменения то тут немного сложнее, можно добиться запрета во время работы программы но нет возможности сделать запрет изменения после. К слову, цитадельные файлы SAM контроля пользователей Windows и те можно изменить. Можно добавить контроль по сумам MD5 или прочим алгоритмам, что при не совпадении сумы затирать, что б не брать из этого файла инфу.
Вопрос насчёт времени предназначен для этой темы Измерение времени исполнения функции (http://forum.oszone.net/thread-30712.html)

А в примере уже всё так реализировано: использовать управляющий символ \n в (f)printf, про другие здесь ( http://msdn.microsoft.com/en-us/library/1k1tykhc(VS.71).aspx).
А на эти клавиши идёт реакция?
Не стоит дописывать новым постом вопросы, разве прошло более чем три дня, лучше использовать редактирование поста, на который ещё нет ответа.

DENoszone
02-07-2008, 18:48
про время загвостка.
и ещё в файле на какойто строчке пропущен символ, то что бы я мог сделать проверку..ifом это как сделать...

и ещё


для чтения из файла я использую

int size;
FILE*f=fopen("KeyCod.txt","r+");
if (f==0)return;
char get[6];
if(fgets(get,10,f)!=0)
size=atoi(get);
else return;
int*ptr=new int[size];
if(ptr==0)return;
for(int i=0;i<size;i++){
fgets(get,10,f);
ptr[i]=atoi(get);
}

fclose(f);
но я не сильно понимаю что такое get что такое atoi точнее зачем он тут нужен.
и структура файла должна быть что бы первый символ говорил сколько строчек в файле..можно это как то убрать?
ptr [i] - номер строчки.

Admiral
02-07-2008, 19:16
get судя по написанному коду это массив из 6 ти символов.
atoi (http://www.cplusplus.com/reference/clibrary/cstdlib/atoi.html) - функция преобразовывая символ в число. Естественно если символов не цифра, то возвращаемым значением будет 0.
Можно подсчитать количество строк в файле, поиском служебных символов конец строки, возврат каретки (коды 13 и 10), но проще использовать упомянутую строчку кода - while (!feof(fSettings))

DENoszone
02-07-2008, 19:20
я не понимаю...
ну и как я буду проверять?
вот у меня ptr [1] - это тот символ который отвечает за движение вверх.
а как через то что ты сказал не понимаю+(

Admiral
02-07-2008, 20:10
Покажу на коде.
int i=0;
for(int i=0;i<size;i++) while (!feof(fSettings))
{
fgets(get,10,f);
ptr[i]=atoi(get);
i++;
}

DENoszone
02-07-2008, 20:19
и что это должно сделать???
у меня фигня вылетает =(

Admiral
02-07-2008, 20:21
Если в size была верно указанная последняя строчка то переделанный код должен был делать идентичные действия что и ранее.

DENoszone
02-07-2008, 20:27
Давайте все уточним.
у меня код считывания.
int size;
FILE*f=fopen("KeyCod.txt","r+");
if (f==0)return;
char get[6];
if(fgets(get,10,f)!=0)
size=atoi(get);
else return;
int*ptr=new int[size];
if(ptr==0)return;
for(int i=0;i<size;i++){
fgets(get,10,f);
ptr[i]=atoi(get);
}

fclose(f);

как я понял вы мне предложили изменить на
int size;
int i=0;
FILE*f=fopen("KeyCod.txt","r+");
if (f==0)return;
char get[6];
if(fgets(get,10,f)!=0)
size=atoi(get);
else return;
int*ptr=new int[size];
if(ptr==0)return;
for(int i=0;i<size;i++) while (!feof(fSettings))
{
fgets(get,10,f);
ptr[i]=atoi(get);
i++
}

fclose(f);

это мне поможет как поверять если в ptr[i] число если нету...то использовать по стандарту.

Admiral
02-07-2008, 20:59
Давайте уточним, приведу код целиком.
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{

FILE*f=fopen("KeyCod.txt","r+");
if (f==0) return 0;

int* ptr = new int[];
int i=0;
char get[6];
while(!feof(f))
{
fgets(get,i,f);
ptr[i]=atoi(get);
printf(" %i ",ptr[i]);
i++;
}
fclose(f);

return 0;
}
Возвращаясь к atoi то он нужен в коде для того что б присвоить численные значения из файла к соответствующим численным переменным.

DENoszone
02-07-2008, 21:09
ну он у меня тупо вылетает...может я не то пониааю..ии что?
мне потом надо стравнивать
ptr[1] - если нажата клавиша 80 то делается шаг вниз.

DENoszone
03-07-2008, 17:54
вопрос?
как записать число в определеную строчку к примеру 7

если в файле встречается в строчке 0 - ну тоесть в строчки не чего нету...то послать на какуюту функцию.

Admiral
03-07-2008, 19:03
Записать не проблема

for (int i=1;i<7;i++)
fprintf(f,"%i\n",i);
fprintf(f,"%i",i);
А вот дописать нужно будет предусмотреть не стирание предыдущих строчек. Проще всего это сделать если держать всё в массиве или структуре. Но лучше работать в двоичном режимы ибо понятие строчки в файле нет, а только служебные символы.

Пустая строчка или перевод и возврат каретки обозначается как \n
int c;

while( (c=getc(f)) != EOF)
{
if( c != '\n') printf( "%i ", c);
else printf( "\n");
}
fclose(f);
Checking for a blank line in an input file (http://forums.devshed.com/c-programming-42/ansi-c-checking-for-a-blank-line-in-an-input-527784.html)

DENoszone
03-07-2008, 19:16
1. спасибо
2. не оч. понял.
вот естьь файл:

7 \не важно
\ пропущен символ
80
77
76
32
9
1 \ не важно какой символ


пропущенный символ это ptr[0] ptr[1]= 80 и так далее...
вот надо что бы оно проверяло если что то там....и если нету...то или записывало в эту строчку..или ещё что то делало...

хотя можно как то один раз считать с файла ... в какой то другой масив ptr1[] где можно было бы спокойно присвоить ptr[0] - любое значение.

DENoszone
03-07-2008, 20:30
вот знаю...алгоритм...
но не назю релизацию.
проверка..если в файле нету первых 6 строчек хотя бы одной...
то я буду пересылать в одну функцию...

Admiral
03-07-2008, 23:13
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char* argv[])
{

FILE*f=fopen("KeyCod.txt","r+");
if (f==0) return 0;

int* ptr = new int[];
int i=0;
char get[1024];
while(!feof(f)) эта строчка не нужна так следом за ней дублирующая её функции
while(fgets(get, 1024, f) != NULL)
{
if ( (atoi(get))!=0)
printf("%s ",get);
else
printf("Na strochke %i sumvol %s vmesta chisla ili strochka pystaya", i, get);//проверка..если в файле нету первых 6 строчек может быть сдесь
i++;
}
fclose(f);

return 0;
}




© OSzone.net 2001-2012