I/O error 104
31/07/2008
0
Estou tendo dificuldades p resolver esse problema de I/O error 104 na rotina abaixo:
begin {CARREGA ARQUIVO DE ORIGEM} NomeEntrada := ParamStr(1); // Atribui a variavel NomeEntrada o nome do arquivo txt NomeTemp := ´C:\teste.tmp´; // Atribui arquivo temporário Reset(ArqEnt,NomeEntrada); ReWrite(ArqSai,NomeTemp); // Cria arquivo temporário ReadLn(ArqEnt,Linha); {Verifica se não é final do arquivo de entrada} while not eof(ArqEnt) do begin ReadLn(ArqEnt,Linha); TRec.Remove([1,3],Linha); // Chama função que ira excluir coluna 1 e 3 de arquivo txt WriteLn(ArqSai,Linha); // Grava em Arquivo de saida end; CloseFile(ArqEnt); CloseFile(ArqSai); DeleteFile(NomeEntrada); // Exclui arquivo de entrada RenameFile(NomeTemp,NomeEntrada); // Renomei arquivo .temp O erro está dando depois que ele le a linha WriteLn(ArqSai,Linha); e retorna para o While.
Shion86
Posts
31/07/2008
Shion86
O erro está dando depois que ele le a linha WriteLn(ArqSai,Linha);
e retorna para o While. Será que tem haver com a função??
Criei ela acima do programa:
class function TRec.Remove(r : array of integer;linhaarq:string):String; var S,StrAux,str,novastring: string; var i,j,ini,fim,x,h,tamanho,w: integer; begin i:=1; j:=0; h:=1; StrAux:=´´; S:= Linha; while Pos(´;´, S) > 0 do begin rem[j].ini := i; rem[j].fim:= Pos(´;´, S); rem[j].coluna:=j; inc(j); i:=Pos(´;´, S)+1; S[Pos(´;´, S)] := ´|´; end; for i:=0 to high(r) do begin for h:= 0 to high(rem) do begin if r[i] = rem[h].coluna then begin ini:= rem[h].ini; fim:= rem[h].fim; for x:=ini to fim do S[x]:=´ ´; tamanho:= length(S); novastring:=´´; for w:=1 to tamanho do begin if S[w]<>´ ´ then novastring:=novastring+S[w]; end; end; end; end; while Pos(´|´, novastring) > 0 do begin novastring[Pos(´|´, novastring)] := ´;´; end; Remove:= novastring; end;
01/08/2008
Aroldo Zanela
01/08/2008
Aroldo Zanela
Oops! Peguei o fragmento errado. Segue:
Há algum comando de leitura ou escrita após o fechamento dos handles de acesso aos arquivos.
01/08/2008
Shion86
Arold obrigado mais uma vez pela ajuda, eu estava com problema na função e com o auxilio de um colega do trampo, conseguimos resolver o problema e implementamos tb um array dinamico.
vou postar o código aqui p alguém que precisar, possa utilizar ou ate dar outras sugestões de como fazer ..
Exemplo de arquivo txt:
1001;BRADESCO;0122;TITULAR; 1002;ITAU;0124;TITULAR; 1003;SANTANDER;0123;TITULAR; 1004;BRADESCO;0129;TITULAR; 1005;REAL;0127;TITULAR;
terei que fazer uma aplicação em console, que exclua a coluna 1 e a 3, depois grave no mesmo arquivo de origem as informações.
ficando assim:
BRADESCO;TITULAR; ITAU;TITULAR; SANTANDER;TITULAR; BRADESCO;TITULAR; REAL;TITULAR;
O código abaixo fará isso:
program COLUNA; {$APPTYPE CONSOLE} uses SysUtils, Dialogs, Classes; type TRem = record ini, fim , coluna: integer; end; type TRec = class public function Remove(r : array of integer;linhaarq:string):String; public function totalColuna(linha:string):integer; end; var rem : Array of TRem; //ArqEnt : TextFile; //ArqSai : TextFile; ArqEnt : TStringList; ArqSai : TStringList; Linha : String; NomeEntrada : String; NomeTemp : String; F : TextFile; iCount : Integer; rec : Trec; total :integer; function TRec.totalColuna(linha:string) :integer; var total :integer; begin total:= 0; while Pos(´;´, linha) > 0 do begin linha[Pos(´;´, linha)] := ´|´; total:=total+1; end; result:=total; end; function TRec.Remove(r : array of integer;linhaarq:string):String; var S,StrAux,str,novastring: string; var i,j,ini,fim,x,h,tamanho,w: integer; begin i:=1; j:=0; h:=1; StrAux:=´´; // S := ´5003;PORTO SEGURO SAUDE;1;PORTO SEGURO SAUDE;;;TITULAR;MANOEL AREIAS NETO;´; S:= Linha; while Pos(´;´, S) > 0 do begin rem[j].ini := i; rem[j].fim:= Pos(´;´, S); rem[j].coluna:=j; inc(j); i:=Pos(´;´, S)+1; S[Pos(´;´, S)] := ´|´; end; for i:=0 to high(r) do begin for h:= 0 to high(rem) do begin // showmessage(inttostr(h)); if r[i] = rem[h].coluna then begin ini:= rem[h].ini; fim:= rem[h].fim; for x:=ini to fim do // StrAux:= StrAux+ S[x]; S[x]:=´_´; tamanho:= length(S); novastring:=´´; for w:=1 to tamanho do begin if S[w]<>´_´ then novastring:=novastring+S[w]; end; Break; end; end; end; while Pos(´|´, novastring) > 0 do begin novastring[Pos(´|´, novastring)] := ´;´; end; Remove:= novastring; end; var retorno:string; begin rec:= Trec.Create; ArqEnt := TStringList.Create; ArqSai := TStringList.Create; {ATRIBUI VALOR AS VARIÁVEIS} NomeEntrada := ParamStr(1); // Atribui a variável NomeEntrada o nome do arquivo txt NomeTemp := ´C:\Temp.txt´; // Atribui a variável NomeTemp o nome do arquivo de saida //---------------------------------------------------------------------------- if ParamStr(1) = ´´ then begin WriteLn(´COLUNA.EXE <Arq. txt Original> ´); WriteLn(´ ´); end; if ParamStr(1) = ´?´ then begin WriteLn(´PROGRAMA DE EXCLUSAO DE COLUNAS ´); WriteLn(´ ´); WriteLn(´Instruções de uso : ´); WriteLn(´ ´); WriteLn(´Parametros de execução ´); WriteLn(´ ´); WriteLn(´prompt: COLUNA.EXE <Arq. txt original> ´); WriteLn(´ ´); WriteLn(´- <arquivo txt original> : ´); WriteLn(´ Arquivo texto de origem, com todos registros a serem importados ´); WriteLn(´ ´); WriteLn(´ ´); Exit; end; //--------------------------------------------------------------------------- {Verifica se arquivo TXT de origem existe} if not FileExists(ParamStr(1)) then begin WriteLn(´Arquivo "´+ParamStr(1)+´" informado nao existe´); Exit; end; //--------------------------------------------------------------------------- {Carrega arquivo de entrada} ArqEnt.LoadFromFile(NomeEntrada); //--------------------------------------------------------------------------- WriteLn(´-----------------------------------------------------´); WriteLn(´ ´); WriteLn(´ PROGRAMA EXCLUSAO COLUNAS ´); WriteLn(´ COLUNA.EXE - Versao 1.00 ´); WriteLn(´ ´); WriteLn(´-----------------------------------------------------´); WriteLn(´ ´); WriteLn(´Processando................. ´+ ParamStr(1) ); WriteLn(´ ´); //--------------------------------------------------------------------------- Linha :=ArqEnt.Strings[0]; total:= rec.totalColuna(Linha); SetLength(rem,total); //--------------------------------------------------------------------------- {Verifica arquivo de entrada ate o final} for iCount := 0 to ArqEnt.Count-1 do begin Linha :=ArqEnt.Strings[iCount]; // Varre linha a linha do arquivo de entrada retorno:=rec.Remove([0,2],Linha); // Define a posição das colunas a serem excluídas //retorno:=TRec.Remove([0,2],Linha); ArqSai.Add(retorno); // Adiciona cada linha a arquivo de saida end; ArqSai.SaveToFile(NomeTemp); // Salva resultado no arquivo temp //--------------------------------------------------------------------------- {Exclui arquivo de entrada e Renomeia arquivo de temp} DeleteFile(NomeEntrada); RenameFile(NomeTemp, NomeEntrada); //--------------------------------------------------------------------------- WriteLn(´ ´); WriteLn(´Processando Finalizado...............´ ); //--------------------------------------------------------------------------- end.
Clique aqui para fazer login e interagir na Comunidade :)