Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.67/15: Рейтинг темы: голосов - 15, средняя оценка - 4.67
 Аватар для NAYGER
1 / 1 / 0
Регистрация: 30.11.2009
Сообщений: 54

Чтение из файла

04.12.2009, 10:50. Показов 3009. Ответов 17
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
В общем, хотелось бы узнать ответ на такую задачку:

Есть текстовый файл, вида:

8795
:8

9874
:5

3456
:7

9745
:5
и т.д

Есть переменная N которая равна "3456"(N=3456). Далее необходимо по строчно считать файл, если строка равна переменной N, то выводим в поле edit строку которая находится под 3456 и после знака ( : ) (т.е. поле edit должно быть равно 7), если не нашли совпадений или файл пустой, то выводим в поле edit1 сообщение - "нет совпадений".

Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
//R - переменная в которую записывается результат и выводится в edit
//N = 3456 
FILE *file;
char* file_name = "file.txt";
file = fopen ("file.txt","r"); // открываем файл для чтения
while (!feof(file)) // пока не достигли конца будем выполнять условие
{
//fscanf() или fgets()
...
???????
...
}
UpdateData(true);
edit=R;
UpdateData(false);
 
fclose(file);
Просмотрел статьи касающиеся функций fscanf() или fgets(), но не совсем понял как они работают.
Подскажите, как дописать программу?

Добавлено через 30 минут
C++
1
2
fgets(msg,100,in);// читаем строку(100 cbvdjkjd) в буфер msg из in
   k=sscanf(msg,"%s", str);//прочитали строку из строки  msg
Вот, есть еще кусок примера может если с ним как-то поорудовать, то, что-то мож и получится (пока не получается).
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.12.2009, 10:50
Ответы с готовыми решениями:

Как заменить чтение строки из консоли на чтение текстового файла?
основное задание: найти частоту суффикса (например, "ing") в текстовом документе. в прикреплённом коде текст вводится прямо в консоль,...

Чтение чисел из файла. Чтение после конца потока невозможно
Товарищи, помогите. В Pascal'e я не силен, так что не бейте меня ногами, но есть задача: написать обычную программу для расчета некоторых...

Чтение файла, чтение названия папки где находится файл, запись данных на PHP
Допустим у нас есть структура с папками типа Large -> Vehicles -> Firetruck_0 В этой папке лежит файл формата .dat Что нужно сделать? ...

17
 Аватар для solar_wind
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
04.12.2009, 10:57
Читать можно например так:

C++
1
2
3
4
5
6
7
8
char buff[1024];
    CFile file;
    if(file.Open(_T("Путь к файлу"),CFile::modeRead))
    {
 
        count=file.Read(buff,1024);
        file.Close();
       }
0
 Аватар для NAYGER
1 / 1 / 0
Регистрация: 30.11.2009
Сообщений: 54
04.12.2009, 11:06  [ТС]
Да читать, читается, условие кодом не получается написать в тело программы:
Сюда:
C++
1
2
3
...
???????
...
0
 Аватар для solar_wind
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
04.12.2009, 11:14
Ну вот один из многих вариантов:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
count=file.Read(buff,1024);
flag=0;
for(int i=0;i<count-3;i++)
{
if(flag==1)
{
if(buff[i]==":") 
{
edit=buff[i+1];
}
}
if(buff[i]=="3" && buff[i+1]=="4" && buff[i+2]=="5" && buff[i+3]=="6")
{
flag=1;
}
}
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
04.12.2009, 11:30
Вот готовый MFC проект по данной проблеме, код очень прост, если возникнут вопросы - отвечу, пока кидаю архив с проетом и скриншоты работы...Как бонус оснастил прогу диалоговым окном выбора файла
Миниатюры
Чтение из файла   Чтение из файла   Чтение из файла  

Вложения
Тип файла: txt Ishodnie dannie.txt (46 байт, 44 просмотров)
Тип файла: rar test_180.rar (9.2 Кб, 35 просмотров)
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
04.12.2009, 12:07
Кстати, чтобы компилить проект в MFC визарде нужно запустить файл с расширением dsw!!!!
1
 Аватар для NAYGER
1 / 1 / 0
Регистрация: 30.11.2009
Сообщений: 54
04.12.2009, 12:29  [ТС]
В общем урезал вашу программу, под тот вариант который нужен был мне
Но видимо не совсем удачно.
При виде txt файла:
65
:7

856464
:8

45
:5

Если написать, что переменная N=65 или N=45, то результат выводится правильно 7 или 5, а если N=856464, то этот же результат и выводится вместо нужного 8. Т.е. файл не обязательно должен содержать строки одинаковой длины.

И по коду не совсем понятно, где бы найти построчную расшифрофку.

Code
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
 int N=856464; //пременная по которой осущ поиск
    FILE * file;  //Cоздаем указатель на переменную типа FILE
    CString s; 
    s.Format("%d",N);
    if((file = fopen ("file.txt","r"))) //если файл открыт, выполняем след действия
    {
        fseek(file,0,SEEK_END);
        int sLen = ftell(file);
        fseek(file,0,SEEK_SET);
        char * str = (char *)malloc(sLen*sizeof(char));
        fread(str,1,sLen,file);
        fclose(file); //закрываем файл
 
        char * chBuf = strstr(str,s);
        if(chBuf)
        {
            chBuf = strchr(chBuf,':');
            if(chBuf)
            {
                if(strchr(chBuf,'\r'))
                    chBuf[strlen(chBuf) - strlen(strchr(chBuf,'\r'))] = '\0';
                s = (chBuf + 1);
            }
        }
    UpdateData(true);
           S=s;  //выводим результат на экран
           UpdateData(false);
 
    free(str);
    }
 
}
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
04.12.2009, 12:54
Зачем в теле функции вбил int N=856464;???Я специально сделал проект под диалоговый ввод, у меня без сбоев работает всё, убери свои добавления пока. И вводи искомоую константу...(
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
s.Format("%d",N); //Переводим число в строку
fseek(file,0,SEEK_END);//Ставим курсор вконец файла
int sLen = ftell(file);//Получаем позицию курсора, т..к он вконце то то это и есть длина файла
fseek(file,0,SEEK_SET);//Ставим курсор вначало файла
char * str = (char *)malloc(sLen*sizeof(char));//Динамически выделяем память под строку str по размеру файлика
fread(str,1,sLen,file);//считываем все символы из файла
 
char * chBuf = strstr(str,s);//Если строка str содержит константу N (т.е. строчку s)
if(chBuf)//то идём дальше
{
chBuf = strchr(chBuf,':');//На всякий случай проверяем идёт ли после константы ':' - вдруг по запаре не написали в файле данных
if(chBuf)//если : есть идём дальше
{
    if(strchr(chBuf,'\r'))//Если после искомого значения идёт ещё текст то мы должны его обрезать т.е. проверить наличие символов перевода каретки
chBuf[strlen(chBuf) - strlen(strchr(chBuf,'\r'))] = '\0';//Если они есть то обрезаем строку chBuf
//Имеем :8 \r\n какойто текст дальше по файлу делаем следующее
// :8 '\0' - обрезали строку вобщем
s = (chBuf + 1); //У нас строка вида :8 вот этой операцией chBuf + 1 сдвигаем указатель вправо на символ, т.е. получаем строку 8
0
 Аватар для NAYGER
1 / 1 / 0
Регистрация: 30.11.2009
Сообщений: 54
04.12.2009, 13:01  [ТС]
-=ЮрА=- - да в том-то и фишка, что мне не нужно это диалоговое окно, на форму надо чтоб только результат выводился (выводится но не совсем правильно), т.е. столько наворотов не надо, чем проще тем лучше
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
04.12.2009, 13:12
Давай свой проект выкладывай, я тупо под твой код подгоню, думаю так проще и быстрей будет

Добавлено через 6 минут
А вобще вот изменённая под твои замечания функция void ParseFile(LPCTSTR fPath, int N)
Просто воткни её в свою программу и забей в неё необходиміе тебе параметры...

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
void ParseFile(LPCTSTR fPath, int N)
{
    FILE * f;
    m_edit1_1.Format("%d",N);
    if((f = fopen(fPath,"rb+")))
    {
        fseek(f,0,SEEK_END);
        int sLen = ftell(f);
        fseek(f,0,SEEK_SET);
        char * str = (char *)malloc(sLen*sizeof(char));
        fread(str,1,sLen,f);
        fclose(f);
        char * chBuf = strstr(str,m_edit1_1);
        m_edit1_1 = "нет совпадений";
        if(chBuf)
        {
            chBuf = strchr(chBuf,':');
            if(chBuf)
            {
                if(strchr(chBuf,'\r'))
                    chBuf[strlen(chBuf) - strlen(strchr(chBuf,'\r'))] = '\0';
                m_edit1_1 = (chBuf + 1);
            }
        }
        free(str);
    }
    UpdateData(false);
}
0
 Аватар для NAYGER
1 / 1 / 0
Регистрация: 30.11.2009
Сообщений: 54
04.12.2009, 13:12  [ТС]
Мой проект.
Вложения
Тип файла: rar Файл.rar (26.1 Кб, 10 просмотров)
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
04.12.2009, 13:20
Боже какой ужас а не проект (прости за небольшую скептику)
Вот лови подправилВсё работает и с 85 и 45...
Вложения
Тип файла: rar test_180_simple.rar (9.1 Кб, 9 просмотров)
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
04.12.2009, 13:23
В редакторе ресурсов измени надпись в поле Static на такую Введите значение константы N, а затем нажмите ОК
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
04.12.2009, 13:31
Вот твой проект
Вложения
Тип файла: rar Файл.rar (9.9 Кб, 9 просмотров)
0
 Аватар для NAYGER
1 / 1 / 0
Регистрация: 30.11.2009
Сообщений: 54
04.12.2009, 13:59  [ТС]
Оказывается мой обрезок то же работал, я просто txt файл не закрыл и не сохранил
-=ЮрА=-, еще чюток помогешь отточить программку.
C++
1
2
if(strchr(chBuf,'\r'))//Если после искомого значения идёт ещё текст то мы должны его обрезать т.е. проверить наличие символов перевода каретки
chBuf[strlen(chBuf) - strlen(strchr(chBuf,'\r'))] = '\0';//Если они есть то обрезаем строку chBuf
Возможно из-за этих строк она не много не корректно работает, т.е.:
Если я ввожу в поле Edit допустим 8, а в файле есть строчка начинающаяся на 8 (например 84561), то программа выдает результат по этой строке, а не должна. Должно быть полное совпадение поля Edit со строкой.
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
04.12.2009, 14:50
На те строки вообще не обращай внимания, сейчас подумаю как помочь, но программа в этом случае существенно усложниться - теперь при анализе строки нужно будет отталкиваться от того идёт ли символ до или после ':' при этом мне прийдётся ещё учитывать длину искомой строки...
Надо с пол часика на обмозгование...
0
 Аватар для NAYGER
1 / 1 / 0
Регистрация: 30.11.2009
Сообщений: 54
05.12.2009, 11:29  [ТС]
Может как-то так будет?

N - это значение по которому будет осуществляться поиск.
Str - строка с которой производится сравнение.

Пока N не будет равно Str, будет выполняться след действие:
Считываем строки до знака ( : ), если N не равно Str переходим на следующую строку, т.е. через строку и дальше продолжаем сравнивать N и Str, и т.д.

Если нет совпадений, т.е. N не равно Str, пишем в поле на форме, "нет совпадений".
Если же N равно Str, то переходим на следующую строку и выводим в поле формы значение стоящее после ( : ).
0
Автор FAQ
 Аватар для -=ЮрА=-
6614 / 4256 / 401
Регистрация: 08.08.2009
Сообщений: 10,325
Записей в блоге: 24
07.12.2009, 15:54
Вот доделал, учёл все требования
Вложения
Тип файла: rar Файл_НОВЫЙ.rar (13.8 Кб, 22 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.12.2009, 15:54
Помогаю со студенческими работами здесь

Чтение заголовка PCX файла и чтение растровых данных PCX файла
Привет форумчане! Столкнулся с такой проблемой. Нужно считать заголовок PCX файла и растровые данные PCX файла. Код написал. Часть...

Чтение бинарного файла - чтение первых 9 байт
Есть код, который читает первые 9 байт бинарного файла(заголовок записи) void ATS44Encoder::FileEncode() { QFile* file = new...

Переделать в коде чтение из файла в чтение с клавиатуры
Переделайте что бы текст считывался с клавиатуры, а не с файла! Буду благодарен за помощь! //файл должен начинаться со слова, между...

Чтение файла CSV и чтение из Table View
Здравствуйте, задача считать столбцы и строки excel в TextEdit. Прошу помощи в реализиции. Вручную сохраняю xls файл в csv. Потом надо...

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


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

Или воспользуйтесь поиском по форуму:
18
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при изменении наименования справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере изменения наименования типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru