Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Записать переменую в файл (http://forum.oszone.net/showthread.php?t=110185)

DENoszone 29-06-2008 11:32 837620

Записать переменую в файл
 
кратко: я хочу что бы пользователь выберал управление.
в опциях человек может выбрать какая клавиша отвечается за верх какая за них и так далее...
надо что бы код клавишы записывался в тхт файл.
вид файла:
77 // клавиша вверх
79 // клавиша в низ


и так далее.

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

Admiral 30-06-2008 05:27 838200

Запись.
Код:

#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 838345

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

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

DENoszone 01-07-2008 01:23 838948

вот вопрос...как мне записывать в 1 строчку...а другое во второй

DENoszone 01-07-2008 01:53 838957

и ещё как избежать ввода клавиши которые не отлавливаются???
типо ctrl ?

Admiral 01-07-2008 14:33 839289

DENoszone
feof
Если компилятор с прошлой темы не менялся то команда feof входит в заголовочный файл stdio.h, а /*...*/ в примере означает брать шапку и окончание с первого примера поста. Символ ! перед ней означает отрицание, а строчка кода while (!feof(fSettings)) означает "пока не найден конец файла".


Закодировать и/или работать в двоичном режиме?
Закодировать самым примитивным способом можно указывая соответствующие коды символов согласно кодовой таблицы. Character Tables
Двоичныё режим это соответственный режим чтения/записи файла, в котором всё может и оставаться по прежнему.

Запрет и работа с временем
Насчёт запрет на изменения то тут немного сложнее, можно добиться запрета во время работы программы но нет возможности сделать запрет изменения после. К слову, цитадельные файлы SAM контроля пользователей Windows и те можно изменить. Можно добавить контроль по сумам MD5 или прочим алгоритмам, что при не совпадении сумы затирать, что б не брать из этого файла инфу.
Вопрос насчёт времени предназначен для этой темы Измерение времени исполнения функции


А в примере уже всё так реализировано: использовать управляющий символ \n в (f)printf, про другие здесь.
А на эти клавиши идёт реакция?
Не стоит дописывать новым постом вопросы, разве прошло более чем три дня, лучше использовать редактирование поста, на который ещё нет ответа.

DENoszone 02-07-2008 18:48 840668

про время загвостка.
и ещё в файле на какойто строчке пропущен символ, то что бы я мог сделать проверку..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 840702

get судя по написанному коду это массив из 6 ти символов.
atoi - функция преобразовывая символ в число. Естественно если символов не цифра, то возвращаемым значением будет 0.
Можно подсчитать количество строк в файле, поиском служебных символов конец строки, возврат каретки (коды 13 и 10), но проще использовать упомянутую строчку кода - while (!feof(fSettings))

DENoszone 02-07-2008 19:20 840705

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

Admiral 02-07-2008 20:10 840744

Покажу на коде.
Код:

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 840751

и что это должно сделать???
у меня фигня вылетает =(

Admiral 02-07-2008 20:21 840754

Если в size была верно указанная последняя строчка то переделанный код должен был делать идентичные действия что и ранее.

DENoszone 02-07-2008 20:27 840764

Давайте все уточним.
у меня код считывания.
Код:

                                        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 840793

Давайте уточним, приведу код целиком.
Код:

#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 840803

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

DENoszone 03-07-2008 17:54 841506

вопрос?
как записать число в определеную строчку к примеру 7

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

Admiral 03-07-2008 19:03 841560

Записать не проблема
Код:

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

DENoszone 03-07-2008 19:16 841570

1. спасибо
2. не оч. понял.
вот естьь файл:

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


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

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

DENoszone 03-07-2008 20:30 841608

вот знаю...алгоритм...
но не назю релизацию.
проверка..если в файле нету первых 6 строчек хотя бы одной...
то я буду пересылать в одну функцию...

Admiral 03-07-2008 23:13 841760

Код:

#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;
}


DENoszone 03-07-2008 23:18 841768

char get[1024]; - масив на 1024 символа? в строчке?
сейчас поробую

это избежал.
но проблема.
1. если какого то значения нету, то я посылаю его в функцию ввода значений в файл.
но как вернуть его от туда не знаю =( он просто зацикливается.
2. у меня идет так проверка
Код:

Getch();                                                            / отлавливает нажатую клавишу
                                        if (ptr[0]==a)    / и сравнивает ... как мне теперь первую строчку вытащить?
                                        {
                                            if (ps.Y>1)
                                                                ps.Y-=2;
                                                                SetConsoleCursorPosition(h,ps);
                                        }


Admiral 04-07-2008 00:09 841811

Просто 1024 число компьютерное :wink:, а вообще надо бы динамику прикрутить.
Код:

while(fgets(get, 1024, f) != NULL)
        {
                ptr[i]=(atoi(get));
                if (ptr[i]!=0)
                printf("%s ",get);
                else
                        //Вводим просто число в ptr[i] как в теме Я хочу запретить ввод букв. Как это сделать?
                i++;
        }

Всё же возврат к Getch();

DENoszone 04-07-2008 00:22 841817

смотри
Код:

                                        int size;
                                        FILE*fSettings;
                                        fSettings=fopen("KeyCod.txt","r+");
                                                if (fSettings==0)return;
                                                                                        int* ptr = new int[];
                                        int i=0;
                                        char get[1024];
                                        while(!feof(fSettings))
                                                while(fgets(get, 1024, fSettings) != NULL)
                                                {
                                                        ptr[i]=(atoi(get));
                                                        if ( (atoi(get))!=0)
                                                        printf("%d ",get);
                                                        else
                                                        cout<<"dasda";
                                                        i++;
                                                }


                                               
                                        Getch();
                                        if (ptr[0]==a)
                                        {
                                            if (ps.Y>1)
                        ps.Y-=2;
                        SetConsoleCursorPosition(h,ps);
                                        }

файл норм.
но оно не двигается. и сразу выводит 1243204.

Admiral 04-07-2008 01:00 841836

Вот так будет вернее
Код:

#include <stdio.h>
#include <stdlib.h>

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

        FILE*fSettings;
        fSettings=fopen("KeyCod.txt","r+");
        if (fSettings==0)return 0;
        int* ptr = new int[];
        int i=0;
        char get[1024];
       
        while(fgets(get, 1024, fSettings) != NULL)
        {
                ptr[i]=(atoi(get));
                if ((ptr[i])==0)
                {//далее вставка из темы Я хочу запретить ввод букв. Как это сделать?
                        int chislo;
                StartAgaine:
                        printf("\nHi! Please enter the NUMBERS only ");
                        if ((scanf("%d",&chislo))!=0)
                        {
                                ptr[i]=chislo;
                        }
                        else
                                {
                                fflush(stdin);
                                goto StartAgaine;
                        }
                }//конец вставки из темы Я хочу запретить ввод букв. Как это сделать?
                printf("%i ",ptr[i]);
                i++;
        }
        return 0;
}


DENoszone 04-07-2008 01:07 841841

если файл со всеми значениями ...
то меня просто посылают...

Код:

        {
                        int chislo;
                StartAgaine:
                        printf("\nHi! Please enter the NUMBERS only ");
                        if ((scanf("%d",&chislo))!=0)
                        {
                                ptr[i]=chislo;
                        }
                        else
                                {
                                fflush(stdin);
                                goto StartAgaine;
                        }

+ не это надо использовать а гетч. так как мне надо что пользователь клавишу нажал.

Admiral 04-07-2008 01:28 841858

То есть после значений 6ти строчек прога должна уходить восвояси? Тогда проверка переменной i на соответствующее значение и говорим пользователю, что все настройки загружены.

DENoszone 04-07-2008 01:31 841860

если все 6 строчек существуют, то надо что бы проходило дальше а оно не проходит

Admiral 04-07-2008 01:36 841865

Дальше по коду и хватит читать файл?
Код:

while(fgets(get, 1024, fSettings) != NULL)
{
        if (i ==6) break;
        /*...*/
}

Дальше по циклу и ранее работало.

DENoszone 04-07-2008 01:44 841872

я запутался.
мне надо:
проверяет по масиву если есть пустая то надо её ввести.
если все на месте продолжить код.


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

Admiral 04-07-2008 02:01 841885

DENoszone, стоит внимательно пересмотреть тему, что бы утрясти хронологию изменения.
Вот что делает код 24м посте.
Он читает по строчке из файла числа. Если строчка пустая, или на ней символ или цифра 0 (надеюсь такой код не используется) то он просит ввести число и в ptr[i] уходит значение не из файла, а именно число с клавы пользователём.
Добавление к коду из 28го поста позволяет интересоваться только значениями 6ти первых строк файла.
Код на первой странице можно переделать и добавить к текущему, что б сбрасывать инфу в файл в правильному 6ти строчному с числами на каждой строчке формате. Так сказать на будущее правильное чтение.

DENoszone 04-07-2008 02:06 841890

понял одно...
лучше всего..
надо проверять есть ли в файле пустые строки первые 6 ?
если есть отсылать пользователя в функцию (она уже есть) что бы он там ввел значния все!
и продолжить работу...гетч отлавливает значение сравнивает его с ptr[1] если равно то действия (ну это уже не важно)
ах да и если файла вообще нету..то опять в функцию.
сенх.

Admiral 04-07-2008 02:17 841894

DENoszone,
про работу с файлами
более подробно про работу с файлами например можна ещё узнать из 12й главы книги А. Нейбауэр. Моя первая программа на C/C++
Я уже приводил линки на неё в теме Я хочу запретить ввод букв. Как это сделать?.

DENoszone 05-07-2008 06:55 842775

вот я ... ***
моя задача решалась очень просто... проверкой в ptr[] - если там ноль...то кинуть что бы написал управление.


Время: 05:06.

Время: 05:06.
© OSzone.net 2001-