Поиск последовательности в файле - C (СИ)
Формулировка задачи:
Приветствую всех, всем доброго времени суток.
Возникла проблема в ходе работы с файлами.
Расскажу немного о работе программы:
Исходные данные
: 2 текстовых файла;Что необходимо сделать
: необходимо открыть файл № 1 (состоящий из строк, разделённых "\n"), считать из него некоторую последовательность цифр, затем открыть файл № 2 (состоящий из так же организованных строк) и найти в нём аналогичную последовательность. Всё, казалось бы, шло как по маслу, вот только возникла проблема: на 12 шаге (то бишь когда из файла № 1 считывается 12 строка и фиксируется последовательность цифр) файл № 2 при попытке открытия (при помощи команды: fin2=fopen("file2.txt","r") fin2 получает значение NULL (хотя до этого всегда получала значение подобное "DS:0148" "DS:0158" и т.д.). Не могу дойти до того, почему происходит получение NULL при очередной попытке открытия файла.#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;
}Решение задачи: «Поиск последовательности в файле»
textual
Листинг программы
int i = 0; while(fgets( file_content[i++] , 1023, fib2 ));
Объяснение кода листинга программы
В данном коде:
- Объявляется переменная
iтипаintи инициализируется значением 0. - Запускается цикл
while, который будет выполняться до тех пор, пока функцияfgetsне вернет значениеNULL. - Внутри цикла
whileпроисходит следующее:- В переменную
file_content[i]записывается содержимое файлаfib2, прочитанное функциейfgets. - Значение
iувеличивается на 1. Значения переменных и их типы: i-int(целое число), используется для итерации по файлу.file_content[i]- массив символов (строка), используется для хранения прочитанного содержимого файла.fib2- файловый указатель, используется для чтения содержимого файла.- 1023 - константа, определяет максимальное количество символов, которое может быть прочитано за одну операцию.
- В переменную