Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
0 / 0 / 0
Регистрация: 15.11.2008
Сообщений: 23
1

Поиск последовательности в файле

27.06.2009, 20:25. Просмотров 1631. Ответов 11
Метки нет (Все метки)

Приветствую всех, всем доброго времени суток.
Возникла проблема в ходе работы с файлами.
Расскажу немного о работе программы:

Исходные данные: 2 текстовых файла;
Что необходимо сделать: необходимо открыть файл № 1 (состоящий из строк, разделённых "\n"), считать из него некоторую последовательность цифр, затем открыть файл № 2 (состоящий из так же организованных строк) и найти в нём аналогичную последовательность. Всё, казалось бы, шло как по маслу, вот только возникла проблема: на 12 шаге (то бишь когда из файла № 1 считывается 12 строка и фиксируется последовательность цифр) файл № 2 при попытке открытия (при помощи команды: fin2=fopen("file2.txt","r") fin2 получает значение NULL (хотя до этого всегда получала значение подобное "DS:0148" "DS:0158" и т.д.).
Не могу дойти до того, почему происходит получение NULL при очередной попытке открытия файла.

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
#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <string.h>
#include <fstream.h>
#include <iomanip.h>
#include <ctype.h>
 
int main()
 
{clrscr();
 
 FILE *fin;         
 FILE *fin2;
 
 const int str_len=47;
 const int id_len=10;
 
 char *id=new char[id_len+1];
 char *idx=new char[id_len+1];
 char *cstr=new char[str_len+1];
 char *cstrx=new char[str_len+1];
 
 int i=0;
 int j=0;
 int x=0;
 int z=0;
 int y=0;
 int q=0;
 
 fin=fopen("PENS.TXT","r"); /*здесь всё описано так же, как ниже, но открытие файла № 1 происходит без проблем*/
 rewind(fin);
 char c='\0';
 
 while((c=fgetc(fin))!=EOF) 
 {
 switch(c)
  {
   case ' ': case ':':
   cstr[y]=c;
   y++;
   i++;
   break;
   case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
   id[x]=c;
   i++;
   x++;
   cstr[y]=c;
   y++;
   if (x==10)
   id[x]='\0';
   break;
   case '\n':   cstr[y]='\0';   x=0;
   int poisk=1;
   j=0;
 
   fin2=fopen("250609.TXT","r"); /*вот тот самый момент, открывающий файл № 2*/
   rewind(fin2);                       
   char s='\0';
    while((s=fgetc(fin2))!=EOF)     
   {
   if (poisk==1)
   {
   switch(s)
    {
    case ' ': case ':':
    cstrx[q]=s;
    q++;
    j++;
    break;
    case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9':
    idx[z]=s;
    j++;
    z++;
    cstrx[q]=s;
    q++;
    if (z==10)
    idx[z]='\0';
    break;
    case '\n':
    cstrx[q]='\0';
    if ((strcmp(id,idx)==0))
     {
     cout<<cstr;
     cout<<endl;
     poisk=0;
     }
    j++;
    z=0;
    q=0;
    break;
    default:
    cstrx[q]=s;
    q++;
    j++;
    break;
    }
   }
   else break;
   }            
   i++;
   y=0;
   break;
   default:
   cstr[y]=c;
   y++;
   i++;
   break;
}
}
 
 getch();           
 return 0;
 
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.06.2009, 20:25
Ответы с готовыми решениями:

Найти в файле адрес начала заданной последовательности
Имеем абсолютный адрес файла, объявлен массив байт - последовательность, которую нужно найти внутри...

Поиск в файле
Не получается осуществить поиск (по коду дисциплины) в файле #include &lt;string.h&gt; ...

Поиск слова в файле
Пишу программку для поиска имени в файле и вывода эго в консоль вместе со всеми данными которые к...

Поиск переменной в файле
Здрасьте! Есть файл, и где-то в нем ,среди множества разных переменных ,есть &quot;,T = 10 c,&quot;, как мне...

11
9 / 9 / 2
Регистрация: 01.05.2009
Сообщений: 127
27.06.2009, 20:35 2
У меня твой код работает...В Visual studio...Может ты файл не создал или он пустой или назвал неправильно??


Цитата Сообщение от happyserge Посмотреть сообщение
(при помощи команды: fin2=fopen("file2.txt","r")
и вот в коде

Цитата Сообщение от happyserge Посмотреть сообщение
*fin2=fopen("250609.TXT","r"); /*вот тот самый момент, открывающий файл № 2*/
Твоя программа только находит последовательность???Или должна удалять ее???
0
0 / 0 / 0
Регистрация: 15.11.2008
Сообщений: 23
27.06.2009, 20:41  [ТС] 3
Она-то работает, причём как первый, так и второй файл содержат предостаточное количество строк. Программа для начала находит совпадения по последовательности цифр и выводит их на экран - я решил пока ограничиться этим.

C
1
2
3
4
5
if ((strcmp(id,idx)==0)) /*strcmp сравнивает 2 строки с последовательностями цифр и при успешности (равности) делает вывод на экран*/
     {
     cout<<cstr;
     cout<<endl;
     ...
0
123 / 121 / 0
Регистрация: 30.03.2009
Сообщений: 766
27.06.2009, 20:46 4
ну, во-первых, принципиальная ошибка - нельзя так издеваться над винчестером!!! открывать файлы надо по одному разу, читать по 100 раз одно и то же с одного файла - это плохо.

ну, и во-вторых, открывать-то файлы ты открываешь, а закрывать кто будет?

ошибка, как мне кажется, в том, что становится слишком много открытых дескрипоторов файла
0
9 / 9 / 2
Регистрация: 01.05.2009
Сообщений: 127
27.06.2009, 20:48 5
А что за defalt у тибя в строке 104 вне цикла switch?
0
0 / 0 / 0
Регистрация: 15.11.2008
Сообщений: 23
27.06.2009, 21:01  [ТС] 6
Цитата Сообщение от Lolcht0 Посмотреть сообщение
ну, во-первых, принципиальная ошибка - нельзя так издеваться над винчестером!!! открывать файлы надо по одному разу, читать по 100 раз одно и то же с одного файла - это плохо.

ну, и во-вторых, открывать-то файлы ты открываешь, а закрывать кто будет?

ошибка, как мне кажется, в том, что становится слишком много открытых дескрипоторов файла
1. Дело в том, что каждый раз считав последовательность из файла № 1 нужно найти совпадения в файле № 2 - поэтому файл № 2 необходимо каждый раз открывать заного.

2. Да, я думал о том, что нужно закрывать файл и делал это так:

C
1
2
3
4
5
6
7
if ((strcmp(id,idx)==0)) /*когда найдём совпадение последовательности - вывод на экран, переменную поиска меняем на 0, чтобы закончить поиск (совпадение найдено) и закрываем файл*/
     {
     cout<<cstr;
     cout<<endl;
     poisk=0;
     fclose(fin2);
     ...
но, увы, на решение проблемы закрытие файла никак не повлияло.

Добавлено через 1 минуту 48 секунд
Цитата Сообщение от Alik-Soldier Посмотреть сообщение
А что за defalt у тибя в строке 104 вне цикла switch?
вне вложенного цикла switch, но внутри первого - смотри внимательней...
0
123 / 121 / 0
Регистрация: 30.03.2009
Сообщений: 766
27.06.2009, 21:11 7
а скопировать содержимое файла в буфер и работать потом с ним - не судьба?
0
0 / 0 / 0
Регистрация: 15.11.2008
Сообщений: 23
27.06.2009, 21:14  [ТС] 8
мм - если этот вариант будет работать - то почему бы нет - подскажете как организовать это?
0
123 / 121 / 0
Регистрация: 30.03.2009
Сообщений: 766
27.06.2009, 21:22 9
ну, в простейшем случае, если не заморачиваться по поводу длины файла и т.п., а я так понимаю, что задачка учебная и можно не заморчиваться, то можно организовать двумерный массив, достаточный по размеру, чтобы в нем помещался весь файл, например
C++
1
char file_content [1024][1024];
потом читаем в него все содержимое файла:
C++
1
2
int i = 0;
while(fgets( file_content[i++] , 1023, fib2 ));
0
0 / 0 / 0
Регистрация: 15.11.2008
Сообщений: 23
28.06.2009, 01:08  [ТС] 10
Всем отозвавшимся спасибо, проблему решил сам - программа работае на 5++!
0
Заказ софта
342 / 187 / 21
Регистрация: 26.05.2009
Сообщений: 863
28.06.2009, 01:11 11
Цитата Сообщение от happyserge Посмотреть сообщение
Всем отозвавшимся спасибо, проблему решил сам - программа работае на 5++!
"Программа работает на 5++" - это означает, что она работает аж на 6. Это же постфиксный инкремент пятерки !
0
0 / 0 / 0
Регистрация: 15.11.2008
Сообщений: 23
28.06.2009, 03:35  [ТС] 12
Цитата Сообщение от Search.. Посмотреть сообщение
"Программа работает на 5++" - это означает, что она работает аж на 6. Это же постфиксный инкремент пятерки !
Ага) Но я подразумевал тонкое сравнение с C++
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.06.2009, 03:35

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Поиск слова в файле
помогите пожалуйста исправить прогу. нужно найти слово в файле. если нашли, то вывести его. int...

Поиск чисел в файле
Написать программу, позволяющую добавлять к существующему ЛИТЕРНОМУ файлу новый товар с проверкой...

Поиск слова в файле
Привет всем! У меня такая проблемка ищу слово по строке, но оно не находит. В чем дело подскажите!...

Поиск информации в файле
Добрый вечер! Нужна помощь в алгоритме действия Нужно написать программу которая ищет информацию...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

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