Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.05.2013, 14:21   #1
alexelev
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 26
Сообщение очередной поиск строки в файле

Дано:
куча файлов вида (Untitled001.pdf, Untitled002.pdf, Untitled003.pdf ...) в количестве более 800 штук;
строки вида (I-А-1, I-А-2, I-А-3, I-А-4, I-А-5, ... ), каждая из которых содержится в одном из кучи файлов.

Найти:
в каком файле содержится какая строка, например "I-А-1 Untitled012.pdf, I-А-2 Untitled117.pdf, ..." и вывести это в файл (исключительно для удобства)

Мой (нерабочий) вариант решения проблемы:

Код:
#include <iostream>
#include <cstring>
#include <ctime>
#include <direct.h>
#include <string.h>
#include <cstdlib>
#include <cstdio>
#include <fstream>
#include <io.h>
#include <stdio.h>
using namespace std;
void main()
{
	//файл, куда будет выводится инфа
	FILE* rslt = _fsopen("E:\\TEST\\rslt.txt", "w", _SH_DENYNO);


	for(int i = 0; i < 1000; i ++)
	{
		//лепим имя файла
		char fp[256] = {0};

		if (i < 9)
			strcpy_s(fp,256,"E:\\TEST\\det\\Untitled00");
		else if (i < 99)
			strcpy_s(fp,256,"E:\\TEST\\det\\Untitled0");
		else
			strcpy_s(fp,256,"E:\\TEST\\det\\Untitled");


		char buf[256] = {0};
		_itoa_s(i+1, buf, 256, 10);
		strcat_s(fp,256,buf);
		strcat_s(fp,256,".pdf\0");
		//на выходе имеем путь к файлу вида "E:\\TEST\\det\\Untitled001.pdf"
		
		//открываем файл
		FILE* fn = _fsopen(fp, "r", _SH_DENYNO);
		
		//пытаемся определить его объём - количество символов файла
		int a = _fileno(fn); //именно тут происходим какая-то ошибка с памятью
		long size = _filelength(_fileno(fn));
		
                //переводим все содержимое файла в буфер
		char* buffer = new char [size];
		fgets(buffer, size, _fsopen(fp, "r", _SH_DENYNO));
		
		for (int j = 0; j < 1000; j ++)
		{
			//формируем искомую подстроку
			char numb[10] = {0};
			_itoa_s(j+1, numb, 256, 10);
			char name[256] = {0};
			strcat_s(name, 256, "I-А-");
			strcat_s(name, 256, numb);
			//на выходе имеем строку вида "I-А-1"

			//находим вхождение искомой строки в буфферном массиве и если есть - записываем в файл соответствие 
			if (strstr(buffer, name) != NULL)
			{
				char temp[256] = {0};
				strcat_s(temp, 256, name);
				strcat_s(temp, 256, "\t");
				strcat_s(temp, 256, fp);
				fputs(temp, rslt);
			}
		}
		fclose(fn);
	}
	_fcloseall();
}
Хотя код следующего вида выполняется на ура:
Код:
	cout << _filelength(_fileno(_fsopen("E:\\TEST\\det\\Untitled001.pdf", "r", _SH_DENYRD))) << endl;
From Stilet: Переоформил пост по правилам.

Последний раз редактировалось Stilet; 06.05.2013 в 16:35.
alexelev вне форума Ответить с цитированием
Старый 06.05.2013, 17:13   #2
alexelev
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 26
По умолчанию

буду признателен за ссылку на способы оформления кода в сообщениях, в справке чегой-то не могу найти ...
alexelev вне форума Ответить с цитированием
Старый 06.05.2013, 17:40   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
ссылку на способы оформления кода в сообщениях
Просмотри какие кнопки оформления есть в редакторе постов обычном и расширенном. PHP, HTML - отдельными тегами. Остальное универсальным тегом по кнокпе #.
Теперь по теме: pdf файлы настоящие или просто расширение такое дано для текстового файла?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 06.05.2013, 21:33   #4
alexelev
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 26
По умолчанию

настоящие pdf-ки
alexelev вне форума Ответить с цитированием
Старый 07.05.2013, 16:44   #5
MegaBEavER
 
Регистрация: 07.05.2013
Сообщений: 4
По умолчанию

Код:
strcat_s(fp,256,".pdf\0");
А ты уверен, что нулевым символом в конце не портишь путь к файлу?
MegaBEavER вне форума Ответить с цитированием
Старый 07.05.2013, 22:27   #6
alexelev
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 26
По умолчанию

уверен, проверял в дебаггере и убирал нуль-терминал вообще - изменений никаких. В строке получения дескриптора (или как он правильно называется?) - _fileno(fn) - происходит какая-то невероятная утечка памяти и выдает неисправимую ошибку. Никак не могу понять в чем причина, алгоритм вроде правильный, функции вроде те, библиотеки все подключил...
alexelev вне форума Ответить с цитированием
Старый 01.06.2013, 19:03   #7
alexelev
Пользователь
 
Регистрация: 05.12.2012
Сообщений: 26
Радость

вижу, что проблема не вызвала особого интереса, но на всякий случай выложу домученное решение:
Код:
#include <iostream>
#include <cstdio>
#include <io.h>
#include <Windows.h>
#include <ctime>

void main()
{
	SetConsoleCP(1251);
	SetConsoleOutputCP(1251);

	time_t start, end, result;
	struct _finddata_t txt_file;
	long hFile;
	int count = 0;

	time(&start);
	FILE* rslt = _fsopen("E:\\TEST\\result.txt", "w", _SH_DENYNO);

	/* определяем количество .txt файлов */
	if( (hFile = _findfirst( "E:\\TEST\\det_text\\*.txt", &txt_file )) == -1 )
		printf( "No *.txt files in current directory!\n" );
	else
	{
		count = 1;
		while( _findnext( hFile, &txt_file ) == 0 )
		{
			count ++;
		}
		_findclose( hFile );
		printf_s("найдено %d файлов для поиска\n", count);
	}
	
	for (int i = 0; i < count; i ++)
	{
		char fn[256] = {0};
			
		if(sprintf_s(fn, "E:\\TEST\\det_txt_ansi\\Untitled%03d.txt", i + 1) == 0 &&
			sprintf_s(fn, "E:\\TEST\\det_txt_ansi\\Untitled%03d.txt", i + 1) == -1)
		{
			printf_s("Ошибка создания пути файла Untitled%03d.txt при поиске\n", i + 1);
			break;
		}
		FILE* f = _fsopen(fn, "r", _SH_DENYRD);
		if(!f)
		{
			printf_s("Ошибка открытия файла Untitled%03d.txt\n", i + 1);
			break;
		}
		int size = _filelength(_fileno(f));

		/*переписываем содержимое файла в буферную строку*/
		char* tmp = new char [size];
		
		for (int j = 0; j < size && tmp[j] != EOF; j ++)
		{
			tmp[j] = fgetc(f);
		}
		fclose(f);

		/*поиск искомой строки и считывание следующих символов до конца строки*/
		for (int k = 0; k < size; k ++)
		{
			char SubStr[20] = "I-А-";
			if(tmp[k] == SubStr[0])
			{
				for(int n = 1; n < size; n ++)
				{
					if(SubStr[n] == 0 && tmp[k + n] != 10)
						SubStr[n] = tmp[k + n];
					else if(tmp[k + n] == '\n' && SubStr[n] == 0)
					{
						fprintf_s(rslt, "%s\t\t%s\n", SubStr, fn);
						break;
					}
					if (tmp[k + n] != SubStr[n]) 
						break;
				}
			}
		}
		delete [] tmp;
	}
	
	_fcloseall();
	time(&end);
	result = end - start;
	printf_s("РАБОТА ПРОГРАММЫ УСПЕШНО ЗАВЕРШЕНА!\nвремя работы программы %d сек\n", result);
}
оставшиеся проблемы заключаются в том, что пдф-фалы необходимо конвертировать в текст, а этот текст потом из юникод в анси, только после этих манипуляций данное решение имеет место быть. Как обойтись без этих танцев с бубном - пока понятия не имею...

Последний раз редактировалось alexelev; 01.06.2013 в 19:05. Причина: так и не научился оформлять код =)
alexelev вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[C++] Поиск строки в файле Alex TGM Общие вопросы C/C++ 7 27.04.2010 22:51
Поиск строки в файле Rekky PHP 24 10.12.2009 11:34
поиск строки в файле getUp Общие вопросы C/C++ 7 24.10.2009 23:19
поиск строки в файле по шаблону andru15 Общие вопросы C/C++ 1 16.02.2009 18:44
Поиск строки в файле Gwynbleidd Общие вопросы C/C++ 1 08.10.2008 01:45