Fórum I/O error 104 #361908
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
Curtir tópico
+ 0Posts
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;
Gostei + 0
01/08/2008
Aroldo Zanela
Gostei + 0
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.
Gostei + 0
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.
Gostei + 0
02/08/2008
Sremulador
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)