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

Функция неправильно сравнивает содержимое файла и элемента структуры - C++

Восстановить пароль Регистрация
 
Apelsin199
11 / 11 / 1
Регистрация: 04.11.2012
Сообщений: 127
04.01.2013, 12:31     Функция неправильно сравнивает содержимое файла и элемента структуры #1
Вот такая ситуация... Есть клочек кода:
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
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
#include <stdio.h>
#include <iostream>
#include <cstdlib>
#include <conio.h>
#include <windows.h>
#include <locale.h>
#include <vector>
#include <conio.h>
using namespace std;
 
struct user
{
    char login[22], password[22];
    int status;
};
 
bool proverca ()
{
    user s;
    FILE *p;
    int n;
    char pas[21];
    p=fopen("pasford.txt","r+b");
    while(!feof(p))
    {
        fscanf(p,"%s", &pas);
        if(strcmpi(pas,s.password))
            return true;
        else
            return false;
    }
}
 
bool UsersMatch(user A, user B)
{
    if (strstr(A.login,B.login) && strstr(A.password,B.password))
        return 1;
    return 0;
}
 
void setText (char *str, int size)
{
    int i = 0;
    char ch;
    do
    {
        scanf("%c",&ch);
        str[i] = ch;
        i++;
        if (str[0] == 10)
        {
            printf("Нельзя вводить пустую строку! Повторите ввод...\n");
            i=0;
        }
        else 
            if ((ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z') || (ch >= '0' && ch <= '9') || ch == 10)
            {
                if(i == size-1)
                {
                    do
                    {
                        scanf("%c",&ch);
                    }
                    while (ch != 10);
                    printf("Слишком длинная строка, пожалуйста, введите строку заново:\n");
                    i = 0;
                }
            }
            else
            {
                printf("Ведены недопустимые знаки, доступны лишь буквы латинского алфавита и цифры\n");
                do
                {
                    scanf("%c",&ch);
                }
                while (ch != 10);
                i = 0;
            }
    }
    while ((i == 0 || ch != 10) && i < size-1);
    str[i-1] = '\0';
    return;
}
 
const char ENTER = 13;
const char BACKSPACE = 8;
 
int main()
{
    setlocale(LC_ALL,"rus");
    user us;
    int i = 0;
    bool fl;
    fl=0;
    printf("Введите логин: ");
    setText(us.login, 20);
    printf("Введите пороль: ");
    char ch;
    do
    {
        while((ch = _getch()) != ENTER)
        {
            if (i < 21)
            {
                fl = 0;
                us.password[i]= ch;
            }
            else
                fl = 1;
            if (ch == BACKSPACE && i > 0)
            {
                i--;
                cout << "\b" << " " << "\b";
            }
            else if (ch != BACKSPACE)
            {
                i++;
                cout << '*';
            }
        }
        if (fl)
        {
            fl = 0;
            i = 0;
            cout << endl << "Неверный пороль. Пожалуйста повторите ввод: ";
        } 
        else 
            if (i == 0)
            {
                cout << endl << "Пароль не может быть пустым" << endl << "Пожалуйста, повторите ввод: ";
            }
    }
    while(!i);
    us.password[i] = '\0';
    if(proverca())
        printf("\nBсе хорошо...");
    else
        printf("\nBсе плохо...");
    getch();
    return 0;
}
Проблема состоит в том, что в main в структуру user переменную password всё записывается адекватно, записываю в этом клочке:
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
    printf("Введите пороль: ");
    char ch;
    do
    {
        while((ch = _getch()) != ENTER)
        {
            if (i < 21)
            {
                fl = 0;
                us.password[i]= ch;
            }
            else
                fl = 1;
            if (ch == BACKSPACE && i > 0)
            {
                i--;
                cout << "\b" << " " << "\b";
            }
            else if (ch != BACKSPACE)
            {
                i++;
                cout << '*';
            }
        }
        if (fl)
        {
            fl = 0;
            i = 0;
            cout << endl << "Неверный пороль. Пожалуйста повторите ввод: ";
        } 
        else 
            if (i == 0)
            {
                cout << endl << "Пароль не может быть пустым" << endl << "Пожалуйста, повторите ввод: ";
            }
    }
Но, когда я вызываю функцию proverca, она всегда возвращает значение true и к тому же нифига не читает то, что я записал в password... в функции proverca я считываю инфу из файла и сравниваю с тем, что я ввёл... как правильно написать функцию? Где я жестко ошибся?...
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.01.2013, 12:31     Функция неправильно сравнивает содержимое файла и элемента структуры
Посмотрите здесь:

C++ Функция сравнивает две строки, игнорируя различия в регистрах
С++ Необъявленный идентификатор при работе с классами. (Функция сравнивает значение свойств объектов) C++
Какая функция сравнивает строку s2 со строкой s1? C++
Удалить элемент структуры с заданным номером медицинской карты, добавить 2 элемента в начало файла C++
C++ Сравнивает ли значения функция srtcmp, если они введены русскими буквами?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
0x10
2425 / 1597 / 232
Регистрация: 24.11.2012
Сообщений: 3,919
04.01.2013, 12:39     Функция неправильно сравнивает содержимое файла и элемента структуры #2
Собственно, что за ерунда просходит в функции со страшным названием proverca? Создается новая структура, поля которой никак не инициализированы и происходит попытка сравнения с тем, что считано из файла.
Apelsin199
11 / 11 / 1
Регистрация: 04.11.2012
Сообщений: 127
04.01.2013, 13:34  [ТС]     Функция неправильно сравнивает содержимое файла и элемента структуры #3
И как быть? как должна выглядить функция?
P.S.
И согласен... название страшное =)
zss
Модератор
Эксперт С++
 Аватар для zss
5944 / 5549 / 1783
Регистрация: 18.12.2011
Сообщений: 14,175
Завершенные тесты: 1
04.01.2013, 13:38     Функция неправильно сравнивает содержимое файла и элемента структуры #4
Сообщение было отмечено автором темы, экспертом или модератором как ответ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
bool proverca ( user s)
{
    FILE *p;
    int n;
    char pas[21];
    p=fopen("pasford.txt","r+b");
    while(!feof(p))
    {
        fscanf(p,"%s", &pas);
        if(strcmpi(pas,s.password))
            return true;
        else
            return false;
    }
}
и соответственно вызов
C++
1
if(proverca(us))
Apelsin199
11 / 11 / 1
Регистрация: 04.11.2012
Сообщений: 127
04.01.2013, 13:41  [ТС]     Функция неправильно сравнивает содержимое файла и элемента структуры #5
Спасибо, всё работает =)
Yandex
Объявления
04.01.2013, 13:41     Функция неправильно сравнивает содержимое файла и элемента структуры
Ответ Создать тему
Опции темы

Текущее время: 15:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru