Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
javse95
0 / 0 / 0
Регистрация: 02.08.2013
Сообщений: 35
#1

Прочитать никнейм из файла и после использования - удалить - C++

20.01.2014, 01:10. Просмотров 1047. Ответов 27
Метки нет (Все метки)

Имеется такой код. к нему нужно написать цикл. Существует файл Nicknames.txt в котором на каждой строчке написано по нику. смысл цикла таков. Из файла Nicknames.txt берется первая строка с ником и подставляется в переменную Nickname, если выполняется это
C++
1
 sampConnect(settings.server.szAddr, settings.server.iPort, Nickname, settings.server.szPassword, pRakClient);
то после этой процедуры надо удалить использованный ник из файла Nicknames.txt и подставить следующую строчку с ником в переменную Nickname, если же выполняется условие else, то нужно использующуюся строку с ником переместить в конец файла Nicknames.txt, а в переменную NewNickname подставить следующую строчку с ником. вот сам код
C++
1
2
3
4
5
6
7
8
9
if(!iConnectionRequested)
        {
            if(!iGettingNewName)
                sampConnect(settings.server.szAddr, settings.server.iPort, Nickname, settings.server.szPassword, pRakClient);
            else
                sampConnect(settings.server.szAddr, settings.server.iPort, NewNickname, settings.server.szPassword, pRakClient);
 
            iConnectionRequested = 1;
        }
Написал довольно таки бредово. Если что не понятно спросите.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.01.2014, 01:10
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Прочитать никнейм из файла и после использования - удалить (C++):

Из текстового файла прочитать четные числа и записать их в другой файл без использования массива (код С++) - C++
Код есть только перед чтением файла нужно его создать, внести 15 чисел и закрыть, через ofstream. #include <iostream> #include...

Удалить числа из файла, без использования дополнительных массивов и файлов - C++
Всем привет, насколько я понимаю, само удаление из файла и не удаление вовсе, открываем файл и переписываем его в другой пропуская какую-то...

Прочитать переменные из файла, а после записать их обратно - C++
Доброе время суток!!! Вот затупил по страшному, не когда не работал с файлами и переменными в них, суть такая есть файл %test.txt%? в...

в классе создаётся объект оператором new, как его удалить после использования в основной программе? delete в вызывающей функции не вариант! - C++
Собсно //Это типа служебного класса. (Внимание! В оригинальном коде он вложен в класс xx, но я этого не стал делать, дабы не...

После использования операции присваивания ошибку выдает само удаление файла - C++
У меня есть шаблон. Его принцип работы как ArrayList из java. Но есть проблема с удалением нетипизированого массива или с операцией...

Прочитать файл в обратном порядке т.е. встать в конец файла и прочитать до начальной позиции - C++
подскажите пожалуйста как можно прочитать файл в обратном порядке т.е. стать в конец файла и прочитать до начальной позиции?

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
23.01.2014, 21:58 #16
C++
1
while(loop < counter - 1)
измените на
C++
1
if(loop < counter - 1)
Не знаю как у вас в основной программе, но если всё это находится в цикле,
т. е. значение iConnectionRequested и так меняется циклически,
то тогда можете оставить if(!iConnectionRequested).
И обратите внимание на 56 строчку, почему там значение iConnectionRequested приравнивается к 1.
1
javse95
0 / 0 / 0
Регистрация: 02.08.2013
Сообщений: 35
23.01.2014, 22:12  [ТС] #17
GuGo1991, ну т.е. мы запрашиваем подключение через sampConnect и приравниваем iConnectionRequested к 1, т.е. мы показываем то что соединение запрошено и следующий sampConnect до изменения iConnectionRequested на 0 посылаться не должен. а iConnectionRequested изменится в дальнейшем на 0 при условии дисконнекта с сервера.

Добавлено через 3 минуты
GuGo1991, Вот при таком коде все работает так как надо. Только в нем Nickname постоянно один используется при sampConnect а надо чтобы подставлялись из текстовика по очереди и все
C#
1
2
3
4
5
6
7
8
9
10
char *Nickname="Nick_Name";
if(!iConnectionRequested)
        {
            if(!iGettingNewName)
                sampConnect(settings.server.szAddr, settings.server.iPort, Nickname, settings.server.szPassword, pRakClient);
            else
                sampConnect(settings.server.szAddr, settings.server.iPort, Nickname, settings.server.szPassword, pRakClient);
 
            iConnectionRequested = 1;
        }
0
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
23.01.2014, 22:20 #18
Ну тогда установите сначала iConnectionRequested = 1; после loop++;
и замените while(loop < counter - 1) и while(!iConnectionRequested)
на if(loop < counter - 1) и if(!iConnectionRequested) соответственно.
Посмотрим, что произойдёт.
1
javse95
0 / 0 / 0
Регистрация: 02.08.2013
Сообщений: 35
23.01.2014, 22:38  [ТС] #19
GuGo1991, вот, теперь флуда подключениями нет, но при последующей посылке sampConnect ник подставляется тот же, т.е. берется 1 строчка постоянно.

Добавлено через 6 минут
GuGo1991, вот сам код
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
string value[100];
    int counter = 0;
    ifstream f("Nicknames.txt");
    while(true)
    {
        if(!f.eof())
        {
            f >> value[counter];
            counter++;
        }
        else
            break;
    }
         if(!iConnectionRequested)
 
    {
        int loop = 0;
        if(loop < counter - 1)
        {
            int i = 0;
            string element = value[i];
            char Nickname[20];
            strcpy(Nickname, element.c_str()); // Преобразование string в char
            
            if(!iGettingNewName)
            {
                
sampConnect(settings.server.szAddr, settings.server.iPort, Nickname, settings.server.szPassword, pRakClient);
Log( Nickname );
                for(int j = i; j < counter - 1; j++)
                {
                    if(value[j + 1] == "")      //
                        break;                  //
                    string temp;                //  Элемент устанавливаем в конец массива
                    temp = value[j];            //  и уменьшаем значение массива на 1,
                    value[j] = value[j + 1];    //  тем самым "имитируем" удаление
                    value[j + 1] = temp;        //
                }
                counter--;
                loop--;
            }  
            else
            {
                
               sampConnect(settings.server.szAddr, settings.server.iPort, Nickname, settings.server.szPassword, pRakClient);
               Log(Nickname);
                for(int j = i; j < counter - 1; j++)
                {
                    if(value[j + 1] == "")      //
                        break;                  //
                    string temp;                //   Элемент устанавливаем в конец массива
                    temp = value[j];            //
                    value[j] = value[j + 1];    //
                    value[j + 1] = temp;        //
                }
                
            }
            loop++;
            iConnectionRequested = 1;  
        }
    }
0
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
23.01.2014, 22:49 #20
Понятно. Тогда дело за малым. Остаётся перезаписать текстовой файл.
Думаю после блока if(!iConnectionRequested) будет в самый раз.
C++
1
2
3
4
5
ofstream of("Nicknames.txt");
    for(int j = 0; j < counter - 1; j++)
    {
        of << value[j] << endl;
    }
На всякий случай, сделайте резервную копию текстовика.
0
javse95
0 / 0 / 0
Регистрация: 02.08.2013
Сообщений: 35
23.01.2014, 22:56  [ТС] #21
GuGo1991, main.cpp(160): error C2065: of: необъявленный идентификатор
0
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
23.01.2014, 22:58 #22
C++
1
ofstream of("Nicknames.txt");
Точно написали?
1
javse95
0 / 0 / 0
Регистрация: 02.08.2013
Сообщений: 35
23.01.2014, 23:03  [ТС] #23
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
string value[100];
    int counter = 0;
    ifstream f("Nicknames.txt");
    while(true)
    {
        if(!f.eof())
        {
            f >> value[counter];
            counter++;
        }
        else
            break;
    }
         if(!iConnectionRequested)
             ofstream of("Nicknames.txt");
    for(int j = 0; j < counter - 1; j++)
    {
        of << value[j] << endl;
    }
 
    {
        int loop = 0;
        if(loop < counter - 1)
        {
            int i = 0;
            string element = value[i];
            char Nickname[20];
            strcpy(Nickname, element.c_str()); // Преобразование string в char
            
            if(!iGettingNewName)
            {
                
sampConnect(settings.server.szAddr, settings.server.iPort, Nickname, settings.server.szPassword, pRakClient);
Log( Nickname );
                for(int j = i; j < counter - 1; j++)
                {
                    if(value[j + 1] == "")      //
                        break;                  //
                    string temp;                //  Элемент устанавливаем в конец массива
                    temp = value[j];            //  и уменьшаем значение массива на 1,
                    value[j] = value[j + 1];    //  тем самым "имитируем" удаление
                    value[j + 1] = temp;        //
                }
                counter--;
                loop--;
            }  
            else
            {
                
               sampConnect(settings.server.szAddr, settings.server.iPort, Nickname, settings.server.szPassword, pRakClient);
               Log(Nickname);
                for(int j = i; j < counter - 1; j++)
                {
                    if(value[j + 1] == "")      //
                        break;                  //
                    string temp;                //   Элемент устанавливаем в конец массива
                    temp = value[j];            //
                    value[j] = value[j + 1];    //
                    value[j + 1] = temp;        //
                }
                
            }
            loop++;
            iConnectionRequested = 1;  
        }
    }
Добавлено через 36 секунд
GuGo1991, вроде написал
0
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
23.01.2014, 23:12 #24
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
string value[100];
int counter = 0;
ifstream f("Nicknames.txt");
while(true)
{
    if(!f.eof())
    {
        f >> value[counter];
        counter++;
    }
    else
        break;
}
if(!iConnectionRequested)
{
    int loop = 0;
    if(loop < counter - 1)
    {
        int i = 0;
        string element = value[i];
        char Nickname[20];
        strcpy(Nickname, element.c_str()); // ÏðåîáðГ*çîâГ*Г*ГЁГҐ string Гў char
            
        if(!iGettingNewName)
        {
            sampConnect(settings.server.szAddr, settings.server.iPort, Nickname, settings.server.szPassword, pRakClient);
            Log( Nickname );
            for(int j = i; j < counter - 1; j++)
            {
                if(value[j + 1] == "")      //
                    break;                  //
                string temp;                //  ГќГ«ГҐГ¬ГҐГ*ГІ ГіГ±ГІГ*Г*Г*âëèâГ*ГҐГ¬ Гў ГЄГ®Г*ГҐГ¶ Г¬Г*Г±Г±ГЁГўГ*
                temp = value[j];            //  ГЁ óìåГ*ГјГёГ*ГҐГ¬ Г§Г*Г*Г·ГҐГ*ГЁГҐ Г¬Г*Г±Г±ГЁГўГ* Г*Г* 1,
                value[j] = value[j + 1];    //  ГІГҐГ¬ Г±Г*ìûì "èìèòèðóåì" ГіГ¤Г*ëåГ*ГЁГҐ
                value[j + 1] = temp;        //
            }
            counter--;
            loop--;
        }  
        else
        {               
            sampConnect(settings.server.szAddr, settings.server.iPort, Nickname, settings.server.szPassword, pRakClient);
            Log(Nickname);
            for(int j = i; j < counter - 1; j++)
            {
                if(value[j + 1] == "")      //
                    break;                  //
                string temp;                //   ÝëåìåГ*ГІ ГіГ±ГІГ*Г*Г*âëèâГ*ГҐГ¬ Гў ГЄГ®Г*ГҐГ¶ Г¬Г*Г±Г±ГЁГўГ*
                temp = value[j];            //
                value[j] = value[j + 1];    //
                value[j + 1] = temp;        //
            }               
        }
        loop++;
        iConnectionRequested = 1;  
    }
}
 
ofstream of("Nicknames.txt");
for(int j = 0; j < counter - 1; j++)
{
    of << value[j] << endl;
}
Должно работать
1
javse95
0 / 0 / 0
Регистрация: 02.08.2013
Сообщений: 35
23.01.2014, 23:17  [ТС] #25
GuGo1991, ВСЕ!!! ЗАРАБОТАЛО!111!!! СПАСИБО ВАМ! КАК Я МОГУ ВАС ОТБЛАГОДАРИТЬ?
0
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
23.01.2014, 23:24 #26
javse95, не за что. Главное что заработало )
1
javse95
0 / 0 / 0
Регистрация: 02.08.2013
Сообщений: 35
24.01.2014, 00:10  [ТС] #27
GuGo1991, ах вот, есть еще один моментик. Расскажу смысл в общих чертах.
Изначально в программе полюбому будет посылаться сначало
C++
1
2
3
if(!iGettingNewName)
        {
            sampConnect(settings.server.szAddr, settings.server.iPort, Nickname, settings.server.szPassword, pRakClient);
так как else может сработать в том случае, если iGettingNewName присвоится 1. Так что получается допустим у меня в текстовом файле находятся строчки
C++
1
2
3
4
Nickname1
Nickname2
Nickname3
Nickname4
Берется первая подставляется и отправляется sampConnect, далее , если на сервере есть игрок с именем Nickname1, то сервер присылает ответ REJECT_REASON_BAD_NICKNAME. и соответсвенно iGettingNewName присваивается 1, и выполняется условие else. И выходит то что Nickname1 удаляется из текстовика и используется Nickname2, который допустим не занят на сервере. И получается то что программа перемещает Nickname2 в конец текстового документа. Вообщем делает наоборот, ник который должен перемещаться в конец документа удаляет, а который должен быть удален, перемещает в конец. Как я понял вот в этой процедуре
C++
1
2
3
4
5
6
else if(byteRejectReason==REJECT_REASON_BAD_NICKNAME)
    {
        iGettingNewName = true;
        Log( "Неправильный ник. Смена ника  ");
        resetPools(1, 0);
    }
надо дописать, чтобы используемый на данный момент Nickname перемещался в конец документа.
0
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
24.01.2014, 03:49 #28
Получается надо ещё раз проверить значение iGettingNewName
после работы функции sampConnect в первый раз
C++
1
2
3
4
5
6
7
8
9
10
11
if(!iGettingNewName)
{
    sampConnect(settings.server.szAddr, settings.server.iPort, Nickname, settings.server.szPassword, pRakClient);
    if(iGettingNewName)   // В этом случае
        break;            // выполнится else
    ...................
}
else
{
    ...................
}
Добавлено через 24 минуты
Хотя не знаю как отреагирет цикл. Посмотрим после компиляции

Добавлено через 6 минут
Думаю этот вариант сработает корректней всего (вместо else вставьте условие if(iGettingNewName)):
C++
1
2
3
4
5
6
7
8
9
10
11
12
if(!iGettingNewName)
{
    sampConnect(settings.server.szAddr, settings.server.iPort, Nickname, settings.server.szPassword, pRakClient);
    if(!iGettingNewName)
    {
        ...................
    }
}
if(iGettingNewName)
{
    ...................
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.01.2014, 03:49
Привет! Вот еще темы с ответами:

Удалить из файла все данные после первого пробела - C++
(дан символьный файл содержащий по крайней мере один символ пробела. Удалить все его элементы, расположенные после первого символа пробела...

Удалить все элементы файла, расположенные после первого символа пробела - C++
Дан символьный файл, содержащий по крайней мере один символ пробела. Удалить все его элементы, расположенные после первого символа пробела,...

Удалить из файла все цифры, если они следуют после знаков препинания. - C++
Дан файл, содержащий символы. Удалить из файла все цифры, если они следуют после знаков препинания. (программа на С)

Прочитать программу на языке C++ и удалить все комментарии - C++
кто-нибудь)помогите написать эту программу=\


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
24.01.2014, 03:49
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru