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

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

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

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

20.01.2014, 01:10. Просмотров 1048. Ответов 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
20.01.2014, 06:57 #2
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
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
int main()
{
    string value[100];
    int counter = 0;
    ifstream f("Nicknames.txt");
    while(true)
    {
        if(!f.eof())
        {
            f >> value[counter];
            counter++;
        }
        else
            break;
    }
    
    for(int i = 0; i < counter - 1; i++)
    {
        if(...............) //Одно из условий.
        {
            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;               
            }
        }   
    }
 
    system("pause");
    return 0;
}
К примеру, можно записать строки с именами из текстовика в массив.
Здесь при нужном условии элемент перенесётся в конец и будет проверяться следующий.
Можно добавить ещё массив и записывать туда.
В конце перезаписать текстовик элементами массива.
1
javse95
0 / 0 / 0
Регистрация: 02.08.2013
Сообщений: 35
21.01.2014, 00:20  [ТС] #3
Спасибо за ответ, но не знаю как все это связать с моим кодом. Как именно задать эти переменные Nickname и NewNickname чтобы они меняли свои значения после выполнения одной из операций.
C++
1
2
3
4
5
6
7
8
9
10
if(!iConnectionRequested)
        {
        char *Nickname, *NewNickname;
                
            if(!iGettingNewName)
                sampConnect(server, port, Nickname, password, client);// если выполнилось это, то удаляем использованную строчку, подставляем слудующую.
            else
                sampConnect(server, port, NewNickname, password, client);// если выполнилось это, то перемещаем использованную строчку в конец, подставляем следующую.
            iConnectionRequested = 1;
        }
Добавлено через 4 часа 48 минут
GuGo1991, может еще что подскажешь?)
0
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
21.01.2014, 02:03 #4
Вот как я себе это представляю, учитывая мой первый ответ:
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
    if(!iConnectionRequested)
    {
        for(int i = 0; i < counter - 1; i++)
        {
            string Nickname = value[i];
            if(!iGettingNewName)
            {
                sampConnect(server, port, Nickname, password, client);// åñëè âûïîëГ*èëîñü ГЅГІГ®, ГІГ® ГіГ¤Г*ëÿåì èñïîëüçîâГ*Г*Г*ГіГѕ ñòðî÷êó, ïîäñòГ*âëÿåì ñëóäóþùóþ.
                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--;                  //
                }
            }  
            else
            {
                sampConnect(server, port, Nickname, password, client);// åñëè âûïîëГ*èëîñü ГЅГІГ®, ГІГ® ïåðåìåùГ*ГҐГ¬ èñïîëüçîâГ*Г*Г*ГіГѕ ñòðî÷êó Гў ГЄГ®Г*ГҐГ¶, ïîäñòГ*âëÿåì ñëåäóþùóþ.
                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;        //
                }
                iConnectionRequested = 1;
            }
        }
    }
1
javse95
0 / 0 / 0
Регистрация: 02.08.2013
Сообщений: 35
21.01.2014, 03:15  [ТС] #5
Цитата Сообщение от GuGo1991 Посмотреть сообщение
Вот как я себе это представляю, учитывая мой первый ответ:
а где в этом коде загрузка ников из файла Nicknames.txt?

Добавлено через 19 минут
GuGo1991, вот что выдало при компиляции
XML
1
2
3
4
1>main.cpp(146): error C2664: sampConnect: невозможно преобразовать параметр 3 из "std::string" в "char *"
1>          Для выполнения данного преобразования нет доступного оператора преобразования, определенного пользователем, или вызов оператора невозможен
1>main.cpp(160): error C2664: sampConnect: невозможно преобразовать параметр 3 из "std::string" в "char *"
1>          Для выполнения данного преобразования нет доступного оператора преобразования, определенного пользователем, или вызов оператора невозможен
0
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
21.01.2014, 04:09 #6
Цитата Сообщение от javse95 Посмотреть сообщение
а где в этом коде загрузка ников из файла Nicknames.txt?
Учитывая мой первый ответ, ники уже загружены в массив value[].
Следовательно все манипуляции выполняются в массиве.
После всех операций, если есть необходимость, можно массив с оставшимися никами записать в текстовик...

Добавлено через 3 минуты
Цитата Сообщение от javse95 Посмотреть сообщение
вот что выдало при компиляции
В функции sampConnect, тип аргумента Nickname измените на string.
Не забудьте добавить:
C++
1
#include <string>
Добавлено через 47 минут
В алгоритме во время "удаления", counter декриментируем после блока цикла for:
C++
1
2
3
4
5
6
7
8
9
10
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;     
}
counter--;
1
javse95
0 / 0 / 0
Регистрация: 02.08.2013
Сообщений: 35
21.01.2014, 15:18  [ТС] #7
GuGo1991, спасибо, получился вот примерно такой код. все скомпилировалось, но при запуске приложения ни одна из функций SampConnect не инициализируется. В функции sampConnect, тип аргумента Nickname изменить на string не получится. Пришлось делать как то так. Что тут не правильно?
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
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
...................................
if(!iConnectionRequested)
    {
    string value[100];
    int counter = 0;
    ifstream f("Nicknames.txt");
        for(int i = 0; i < counter - 1; i++)
        {
            string Nickname = value[i];
            
            char* Nick = &Nickname[0]; 
    
            cout<<Nick<<std::endl;
    
    if(!iGettingNewName)
            {
                sampConnect(settings.server.szAddr, settings.server.iPort, Nick, settings.server.szPassword, pRakClient);// если выполнилось это, то удаляем использованную строчку, подставляем слудующую.
                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--; 
            }  
            else
            {
                 sampConnect(settings.server.szAddr, settings.server.iPort, Nick, settings.server.szPassword, pRakClient);// если выполнилось это, то перемещаем использованную строчку в конец, подставляем следующую.
                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;        //
                }
                iConnectionRequested = 1;
            }
        }
    }
0
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
22.01.2014, 00:27 #8
Попробуйте так:
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
#include <iostream>
#include <fstream>
#include <string>
 
using namespace std;
 
int main()
{
    string value[100];
    int counter = 0;
    ifstream f("Nicknames.txt");
    while(true)
    {
        if(!f.eof())
        {
            f >> value[counter];
            counter++;
        }
        else
            break;
    }
    
    if(!iConnectionRequested)
    {
        for(int i = 0; i < counter - 1; i++)
        {
            string element = value[i];
            char Nickname[20];
            strcpy(Nickname, element.c_str()); // ÏðåîáðГ*çîâГ*Г*ГЁГҐ string Гў char
            
            if(!iGettingNewName)
            {
                sampConnect(server, port, Nickname, password, client);// если выполнилось это, то удаляем использованную строчку, подставляем слудующую.
                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--;
            }  
            else
            {
                sampConnect(server, port, Nickname, password, client);// если выполнилось это, то перемещаем использованную строчку в конец, подставляем следующую.
                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;        //
                }
                iConnectionRequested = 1;
            }
        }
    }
 
    system("pause");
    return 0;
}
Здесь Nickname отправится в функцию sampConnect типом char.

Добавлено через 22 минуты
Цитата Сообщение от javse95 Посмотреть сообщение
Что тут не правильно?
Цитата Сообщение от javse95 Посмотреть сообщение
C++
1
ifstream f("Nicknames.txt");
Вы создаёте input поток ifstream, но сам массив value[] не заполняете содержимым текстовика.

Цитата Сообщение от javse95 Посмотреть сообщение
C++
1
2
string Nickname = value[i];
char* Nick = &Nickname[0];
Эту часть я не очень понял.
1
javse95
0 / 0 / 0
Регистрация: 02.08.2013
Сообщений: 35
22.01.2014, 00:46  [ТС] #9
GuGo1991, цикл заработал, только почему-то строчка берется через одну.
0
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
22.01.2014, 01:58 #10
Цитата Сообщение от javse95 Посмотреть сообщение
строчка берется через одну.
Скорее всего проблема в условиях.
Цитата Сообщение от GuGo1991 Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
if(!iGettingNewName)
{
 ...
}
else
{
 ...
}
Строчка берётся не через одну, а выполняются оба условия последовательно.
Здесь уже вам придётся покалдовать с условиями.
Как вариант могу посоветовать создать переменную типа bool в начале первого цикла for и установить значение к слову на false.
При выполнении первого условия в блоке if после цикла for установить значение bool-ой переменной на true.
Проверить это же значение в условии else (при false продолжить).

Добавлено через 35 минут
Попробуйте ещё этот вариант условий:
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
    if(!iConnectionRequested)
    {
        int loop = 0;
        while(loop < counter - 1)
        {
            int i = 0;
            string element = value[i];
            char Nickname[20];
            strcpy(Nickname, element.c_str()); // ÏðåîáðГ*çîâГ*Г*ГЁГҐ string Гў char
            
            if(!iGettingNewName)
            {
                sampConnect(server, port, Nickname, password, client);// åñëè âûïîëГ*èëîñü ГЅГІГ®, ГІГ® ГіГ¤Г*ëÿåì èñïîëüçîâГ*Г*Г*ГіГѕ ñòðî÷êó, ïîäñòГ*âëÿåì ñëóäóþùóþ.
                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(server, port, Nickname, password, client);// åñëè âûïîëГ*èëîñü ГЅГІГ®, ГІГ® ïåðåìåùГ*ГҐГ¬ èñïîëüçîâГ*Г*Г*ГіГѕ ñòðî÷êó Гў ГЄГ®Г*ГҐГ¶, ïîäñòГ*âëÿåì ñëåäóþùóþ.
                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;        //
                }
                iConnectionRequested = 1;
            }
            loop++;
        }
    }
1
javse95
0 / 0 / 0
Регистрация: 02.08.2013
Сообщений: 35
22.01.2014, 02:45  [ТС] #11
GuGo1991, спасибо, помогло). еще одна проблема, программа просто флудит подключениями с новыми никами, а как сделать чтобы пока вот эта переменная равна 1
C++
1
 iConnectionRequested = 1;
следующая команда не отправлялась? если переменная поменяла значение на 0 то отправляется SampLogin со следующим ником. А то получается соединение запрошено и сразу следующее посылается вместо него и так далее.

Добавлено через 6 минут
В предыдущем сообщении не SampLogin а sampConnect. ошибся
0
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
23.01.2014, 19:26 #12
Я как понял вам надо использовать ник для другой операции, не только отправить в функцию sampConnect?
Тогда лучше действие перенести в цикл. То есть, выполнить после условий if и else,
в теле цикла while.
1
javse95
0 / 0 / 0
Регистрация: 02.08.2013
Сообщений: 35
23.01.2014, 20:58  [ТС] #13
GuGo1991, смысл данного кода который вы мне написали, как я понял в том , что если выполнилось допустим условие
C++
1
if(!iConnectionRequested)
и
C++
1
if(!iGettingNewName
, то идет сразу цикл посыла команд sampConnect, и как я понял уже игнорируется вот это
C++
1
if(!iConnectionRequested)
. а вот как сделать так: допустим выполняется
C++
1
if(!iGettingNewName
подставляется первая строчка с ником, отправляется sampConnect с ним; подставляется в переменную Nickname вторая строчка с ником, но чтобы
она не сразу отправлялась, а только когда опять будет условие
C++
1
 if(!iConnectionRequested)
и соответственно к ней
C++
1
if(!iGettingNewName)
или
C++
1
else
. Т.е. проще сказать мы посылаем команду и подставляем в переменную Nickname следующий ник и пусть программа ждет пока что условие if(!iConnectionRequested) опять выполнится.
0
GuGo1991
267 / 261 / 93
Регистрация: 02.08.2012
Сообщений: 609
23.01.2014, 21:22 #14
Цитата Сообщение от javse95 Посмотреть сообщение
C++
1
if(!iConnectionRequested)
Условие if выполнится один раз и как вы заметили будет игнорироваться до конца цикла.
Если вам надо проверять значение iConnectionRequested каждый раз,
то придется использовать цикл while, а не условие if:
C++
1
while(!iConnectionRequested)
1
javse95
0 / 0 / 0
Регистрация: 02.08.2013
Сообщений: 35
23.01.2014, 21:50  [ТС] #15
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
 string value[100];
    int counter = 0;
    ifstream f("Nicknames.txt");
    while(true)
    {
        if(!f.eof())
        {
            f >> value[counter];
            counter++;
        }
        else
            break;
    }
         while(!iConnectionRequested)
 
    {
        int loop = 0;
        while(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;        //
                }
                iConnectionRequested = 1;
            }
            loop++;
        }
    }
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
23.01.2014, 21:50
Привет! Вот еще темы с ответами:

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

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

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

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


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

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

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