• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

xerxes

Programa para ler multiplos TXTS, ler conteudo e listar desejados, Prob Estranho

3 mensagens neste tópico

Ola pessoal, venho pedir ajuda num programa que estou a tentar fazer, que esta perto de estar pronto, mas acontece 1 problema estranho.

O programa faz o seguinte: Depois de saber onde estar o caminho para uma pasta que contem MTS ficheiro de texto, vai abri-los 1 a 1 ler o conteudo e lista-los no ecra caso contenham o que se insira numa string para procurar :P

O programa, le os ficheiros todos, mas quando faço 1 simples Fopen o prog fica crachado n percebo porque.

Se alguem vir qual é o problema que me diga que eu n estou a conseguir, pode até ser uma coisa simples...

desd já 1 OBRIGADO a todos, e em especial aqueles que ja tanto me ajudaram noutros topicos.. abraço

Aqui esta o codigo:

#include <windows.h>
#include <iostream>
#include <fstream>
#include <string>
#include <cstdlib>
#include <stdio.h>
#include <string.h>
#include <conio.h>

using namespace std;

int main()
{
int x=0;
string path = "Z:\\os meus documentos\\backup sms\\";
string searchPattern = "*.txt";
string fullSearchPath = path + searchPattern;

WIN32_FIND_DATA FindData;
HANDLE hFind;

hFind = FindFirstFile( fullSearchPath.c_str(), &FindData );

if( hFind == INVALID_HANDLE_VALUE )
{
	cout << "Error searching directory\n";
	return -1;
}
//isto é meu-------------------------------------------------
		FILE * pFile;
  			long lSize;
  			char * buffer;
		char procurar[20], *posicao;
		char teste[20];
		fflush(stdin);
			printf("Introduza o texto a procurar: ");
			scanf("%20s", procurar);

//-------------------------------------------------------------

do
{
	string filePath = path + FindData.cFileName;
	ifstream in( filePath.c_str() );

	if( in )
	{

//-------------------MEU ESPAÇO--------------------------------------
	/*	x++;
		printf("existem %i ficheiros\n", x);
		cout << FindData.cFileName << endl; //nome do ficheiro
	*/

		fflush(stdin);
		pFile = fopen ( FindData.cFileName , "r" ); // aqui ESTA O ERRO!!!!!!!!!!!!!!!

  			if (pFile==NULL){
		  printf("\nNULL a abrir ficheiro\n");
		  }
		  
		// obtain file size.
  			fseek (pFile , 0 , SEEK_END);
  			lSize = ftell (pFile);
  			rewind (pFile);
  			
  			// allocate memory to contain the whole file.
  			buffer = (char*) malloc (lSize);
  			if (buffer == NULL){
  				printf("\nNULL a Alocar memoria\n");
		   getchar();
		  }
  			 // copy the file into the buffer.
  			fread (buffer,1,lSize,pFile);
  			
			posicao=strstr(buffer,procurar);  	
			if(posicao != NULL){
 			printf("O texto [%s] esta na posicao %i do texto:\n%s\n", procurar, (posicao-buffer)/sizeof(char),buffer);
 			getchar();

 		}
		fclose (pFile);
  			free (buffer);


		// do stuff with the file here
//-------------------------------------------------------------------
	}
	else
	{
		cout << "Problem opening file " << FindData.cFileName << "\n";
	}
}
while( FindNextFile(hFind, &FindData) > 0 );

if( GetLastError() != ERROR_NO_MORE_FILES )
{
	cout << "Something went wrong during searching\n";
}

system("pause");
return 0;
}

// Note that you can use GetLastError() to get better error information for the
// WinAPI calls but I did not want to complicate the example

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pôxa... nem sei que te diga.

Estás a usar código C misturado com C++, a incluir headers que nunca usas, e a misturar a Win32 API com código C. Terei que olhar para isto com mais atenção e não tenho tido muito tempo livre nos últimos dias. O código terá que ser corrigido em muitos sítios para funcionar (acredita, a linha em que notas o erro é o menor dos teus problemas).

Sugiro que de onde quer que tenhas copiado o código, nunca mais o faças. Apaga esse endereço web da tua página e o autor deveria estar atrás das grades. Sugiro talvez que comeces de novo com código C++. Não precisas do conio.h, nem do windows.h, para fazer uma aplicação que corre na consola. Procura por "c++ tutorial fstream"

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

O Marfig tem razão em muito do que diz, só discordo da parte do windows.h ser desnecessário. É necessário para fazer a pesquisa dos ficheiros na directoria.

O erro que detectaste (e sobre o qual podias ter sido mais específico) ocorre porque o programa está a tentar abrir o ficheiro na directoria em que se encontra. Se vires o conteúdo da variável FindData.cFileName, verás que contém apenas o nome do ficheiro, e o programa não adivinha em que directoria este se encontra, pelo que vai tentar encontrá-lo na directoria de onde estás a correr o programa.

Mas existe outro problema, que ao mesmo tempo é solução: o ficheiro que queres abrir já se encontra aberto, aqui: ifstream in( filePath.c_str() );, pelo que o teu fopen é desnecessário e poderia até causar alguns erros.

- Utiliza os métodos do fstream in em vez de tentares abrir o ficheiro com fopen, é bastante mais simples de utilizar: in.get em vez de fread, in.close em vez de fclose;

- Não estás a alocar espaço para o caracter terminador de string no malloc;

- Se queres saber o tamanho do ficheiro, utiliza os campos FindData.nFileSizeLow e FindData.nFileSizeHigh, que perfazem um valor de 64 bits. Mais informações aqui

- Tenta alocar espaço para ler o ficheiro apenas se este tiver um tamanho inferior a um dado valor, senão arriscas a tentar abrir um ficheiro de tamanho superior à memória disponível;

- utiliza um cin.clear(); cin.get(); em vez do system(pause);, é melhor e mais elegante, no mínimo porque evita a invocação de outro processo.

- Não te esqueças de chamar FindClose(hFind) no final do programa.

No fim, verás que só precisas dos headers <windows.h>, <iostream>, <fstream> e <string>.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora