Jump to content

Recommended Posts

Posted

Pessoal. foi me pedido pra fazer um programinha em pascal (ainda estou aprendendo) que fizesse o seguinte:

Faça um programa em Pascal que processe dois arquivos texto, incluindo o segundo arquivo no primeiro a partir de uma linha escolhida.

Seu programa deve, inicialmente, pedir ao usuário os nomes dos arquivos, garantindo nomes distintos.

Em seguida, deve pedir ao usuário qual é a linha do primeiro arquivo depois da qual as linhas do segundo arquivo deverão ser inseridas.

Seu programa também deve mostrar na tela os conteúdos dos dois arquivos originais.

Em seguida, deve mostrar o conteúdo do primeiro arquivo modificado pela inclusão.

Caso algum arquivo não exista, crie-o com conteúdo vazio e, caso a linha de inserção não exista, crie linhas vazias até aquela linha escolhida, incluindo o segundo arquivo a partir dali.

Até aqui eu fui.

Mas não esta dando certo.

Alguem poder me ajudar?

program arquivo;
uses Crt;
var
 primeiro, segundo: string;
 p,s:text;
 i, linha:integer;
function FileExists(Filename:String):Boolean;
var
  f:File;
begin
  Assign(F,FileName);
  {$I-}
  Reset(F);
  {$I+}
  FileExists:=IOResult=0;
end;
begin
 writeLn('Ola. Faremos dois arquivos para inserirmos o conteudo do segundo arquivos ser colocado no meio do primeiro');
 writeLn('Apos digitar o nome dos dois arquivos, popr favor, sigite a linha do primeiro arquivo arvivo a partir da qual, o segundo entrará');
 writeLn('Detalhe: escolha nomes de arquivos não existentes em seu sistemas');
 writeLn ('Escreva um nome para criarmos o primeiro arquivo: ');
 read(primeiro);
 while FileExists(concat(primeiro,'.txt'))=true do  writeLn('Esse arquivo ja existe Por favor escolha outro nome');
 { cria primeiro arquvo}
 assign(p, concat(primeiro,'.txt'));
 ReWrite (p);	 
 for i:=1 to 10 do  writeln (p, random(10));

 writeLn ('Escreva um nome para criarmos o segundo arquivo: ');
 read(segundo);
 while FileExists(concat(segundo,'.txt'))=true do  writeLn('Esse arquivo ja existe Por favor escolha outro nome');
 { cria segundo arquvo}
 assign(s, concat(segundo,'.txt'));
 ReWrite (p);	 
 for i:=1 to 10 do  writeln (s, random(10));
 writeLn('Digite a linha a partir da qual o segundo arquivo entrara no meio do primeiro');
 readLn(linha);

 readkey;
end.
  • Replies 84
  • Created
  • Last Reply

Top Posters In This Topic

Posted (edited)
Seu programa deve, inicialmente, pedir ao usuário os nomes dos arquivos, garantindo nomes distintos.

Isto não faz o pedido

writeLn ('Escreva um nome para criarmos o segundo arquivo: ');

read(segundo);

Eu faria assim:

writeLn ('Escreva um nome para criarmos o segundo arquivo: ');

repeat
 readln(segundo);
 if primeiro=segundo then writeln('O nome do segundo ficheiro é igual ao do primeio. Introduza outro nome:');
until primeiro<>segundo;

Tens o programa até pedir o número da linha agora é só fazer o resto....

Eu renomearia o primeiro ficheiro para *.BAK e depois criava um terceiro copiando até à linha pedida a informação do primeiro depois toda a informação do segundo e por fim o resto da informação do primeiro.

Ainda tens de mostrar os ficheiros, isto podes fazer quando estás a criar os ficheiros. Copias para dentro do ficheiro e mostras a mesma informação.

Edited by passarito
Posted (edited)

Bom!

Estou começando a faculdade de Computação, e foi me pedido que fizesse esse programinha em pascal!

Fiz algumas alteraçoes.

Veja o que eu fiz:

program arquivo;
uses Crt;
var
 primeiro, segundo: string;
 p,s: text;
 i, linha:integer;
function FileExists(Filename:String):Boolean;
var
  f:File;
begin
  Assign(F,FileName);
  {$I-}
  Reset(F);
  {$I+}
  FileExists:=IOResult=0;
end;
begin
 writeLn('Ola.');
 writeLn('Faremos dois arquivos para inserirmos o conteudo do segundo arquivo no meio do primeiro');
 writeLn('Apos digitar o nome dos dois arquivos, popr favor, sigite a linha do primeiro arquivo arvivo a partir da qual, o segundo entrará');
 writeLn('Detalhe: escolha nomes de arquivos não existentes em seu sistemas');
 writeLn ('Escreva um nome para criarmos o primeiro arquivo: ');
 readLn(primeiro);
 while FileExists(concat(primeiro,'.txt'))=true do
  begin
   writeLn('Esse arquivo ja existe. Por favor escolha outro nome');
  end;
 assign(p, concat(primeiro,'.txt'));  {Atrela a variavel 'p' ao nome do primeiro arquivo}
 rewrite(p);
 for i:=1 to 10 do
  begin
 writeln (p, random(10));
  end;
 writeLn ('Escreva um nome para criarmos o segundo arquivo: ');
 readLn(segundo);
 while FileExists(concat(segundo,'.txt'))=true do
  begin
   writeLn('Esse arquivo ja existe Por favor escolha outro nome');
  end;
 if (primeiro=segundo) then
  begin
   writeLn('O nome do segundo ficheiro é igual ao do primeio. Introduza outro nome:')
  end
 else
  begin
   { cria segundo arquvo}
   assign(s, concat(segundo,'.txt'));  {Atrela a variavel 's' ao nome do segundo arquivo}
   rewrite(s);
   for i:=1 to 10 do
 begin
   writeLn (s, random(10));
 end;
   writeLn('Digite a linha a partir da qual o segundo arquivo entrara no meio do primeiro');
   readLn(linha);
  end;
 readkey;
end.

Acontece que não roda. Compila, não da erro, mas basta eu colocar o nome do primeiro arquivo que o sistema fecha.

Pode me ajudar a achar o erro?

Desde já muito obrigado.

Carlos Rocha

Edited by carcleo
Posted (edited)

Tentei novamente da forma abaixo mas da no mesmo:

program arquivo;
uses Crt;
var
 primeiro, segundo: string;
 p,s: text;
 i, linha:integer;
begin
 writeLn('Ola.');
 writeLn('Faremos dois arquivos para inserirmos o conteudo do segundo arquivo no meio do primeiro');
 writeLn('Apos digitar o nome dos dois arquivos, popr favor, sigite a linha do primeiro arquivo arvivo a partir da qual, o segundo entrará');
 writeLn('Detalhe: escolha nomes de arquivos não existentes em seu sistemas');
 writeLn ('Escreva um nome para criarmos o primeiro arquivo: ');
 readLn(primeiro);
 assign(p, concat(primeiro,'.txt'));  {Atrela a variavel 'p' ao nome do primeiro arquivo}
 reset(p);
 if IOResult<>0 then
  begin
   for i:=1 to 10 do
 begin
   writeln (p, random(10));
 end;
  end;

 writeLn ('Escreva um nome para criarmos o segundo arquivo: ');
 readLn(segundo);
 if (primeiro=segundo) then
  begin
   writeLn('O nome do segundo ficheiro é igual ao do primeio. Introduza outro nome:')
  end
 else
  begin
   assign(s, concat(segundo,'.txt'));  {Atrel a a variavel 's' ao nome do segundo arquivo}
   reset(s);
   if IOResult<>0 then
 begin
  for i:=1 to 10 do
   begin
	 writeln (s, random(10));
   end;
 end;
   writeLn('Digite a linha a partir da qual o segundo arquivo entrara no meio do primeiro');
   readLn(linha);
   if (length(p)<linha) then
 begin
   for i:=1 to linha do
    begin
	  writeLn(' ');
    end;
 end;
   while not eof(s) do
 begin
  if (s[linha]=true) then
  begin
    writeLn('');
    writeLn(s);
    writeLn('');
 end;
 readkey;
end.
Edited by carcleo
Posted (edited)

Os ciclos têm que ter algo que os faça saltar para fora deles. Se dentro de um ciclo apenas o mandares escrever no ecrã, então o ciclo torna-se infinito. 😉

Repara:

Vou pegar no teu penultimo exemplo, pois a função FileExists faz muito mais sentido do que incorporar o esse código no meio do programa. Só vais baralhar o entendimento do código!

while FileExists(concat(primeiro,'.txt'))=true do

begin

writeLn('Esse arquivo ja existe. Por favor escolha outro nome');

end;

Se o ficheiro existir o programa vai ficar aqui para a eternidade! 😄

Isto é tipo escancarado da utilização do ciclo Repeat..Until tal como te disse no meu post anterior a diferença é que neste usas algo do género:

repeat

..

until fileexists(concat(primeiro,'.txt'));

Não te esqueças de aplicar o repeat no readln do 2º ficheiro também!

if (primeiro=segundo) then

begin

writeLn('O nome do segundo ficheiro é igual ao do primeio. Introduza outro nome:')

end

Ok, o problema é que se forem iguais o programa informa-te e salta fora 😕

Outra coisa, para não estares sempre a usar a função concat que só te aumenta o trabalho e complica o código faz isto após leres a variavel:

readln(primeiro);

primeiro:=primeiro+'.txt';

ou como tu gostas

primeiro:=concat(primeiro,'.txt');

Desta forma a tua variável tem logo o nome completo que irás usar mais à frente, aliás se necessitares de um ficheiro auxiliar tipo BAK faz antes outra atribuição

primeiroBAK:=primeiro+'.BAK'

O restante acho que não faz nem de longe nem de perto o que é pedido no 1º post, mas quando lá chegares trabalha isso!

Edited by passarito
Posted (edited)

Essa parte:

while FileExists(concat(primeiro,'.txt'))=true do
  begin
writeLn('Esse arquivo ja existe. Por favor escolha outro nome');
  end;

Pensei que fosse assim:

O cara digitou o nome do ficheiro. Ele jha existe, exibe a mensagem e espera ele digitar de novo o nome do ficheiro.

Após ele colocar um nome ainda não existe ai salta para fora do while.

Seria assim não?

Modifiquei mais um pouco. mas ainda da trez erros.

Veja


program arquivo;
uses Crt;
var
 primeiro, segundo: string;
 p,s: file of string;
 i, linha:integer;
function FileExists(Filename:String):Boolean;
var
  f:File;
begin
  Assign(F,FileName);
  {$I-}
  Reset(F);
  {$I+}
  FileExists:=IOResult=0;
end;
begin
 writeLn('Ola.');
 writeLn('Faremos dois arquivos para inserirmos o conteudo do segundo arquivo no meio do primeiro');
 writeLn('Apos digitar o nome dos dois arquivos, popr favor, sigite a linha do primeiro arquivo arvivo a partir da qual, o segundo entrará');
 writeLn('Detalhe: escolha nomes de arquivos não existentes em seu sistemas');
 writeLn ('Escreva um nome para criarmos o primeiro arquivo: ');
 readLn(primeiro);
 primeiro:= primeiro+'.txt';

 assign(p, primeiro);  {Atrela a variavel 'p' ao nome do primeiro arquivo}
 rewrite(p);
 reset(p);
 if FileExists(primeiro)=false then
  begin
   for i:=1 to 10 do
	 begin
	   write (primeiro, random(10));
	 end;
  end;
 writeLn ('Escreva um nome para criarmos o segundo arquivo: ');
 readLn(segundo);
 segundo:= segundo+'.txt';
 if (primeiro=segundo) then
  begin
   writeLn('O nome do segundo ficheiro é igual ao do primeiro. Introduza outro nome:')
  end
 else
  begin
   assign(s, segundo);  {Atrela a variavel 's' ao nome do segundo arquivo}
   rewrite(s);
   reset(s);
   if IOResult<>0 then
	 begin
	  for i:=1 to 10 do
	   begin	  
		    assign(s, segundo);  {Atrel a a variavel 's' ao nome do segundo arquivo}
		    reset(s);
		    write (segundo, random(10));
	   end;
	 end;
   writeLn('Digite a linha a partir da qual o segundo arquivo entrara no meio do primeiro');
   readLn(linha);
  end;
   if (filesize(p)<linha) then
	 begin
	   for i:=1 to linha do
	    begin
		  writeLn(' ');

		  if (s[linha]=s[i]) then
		    begin
			 write('');
			 write(s);
			 write('');
		    end;
	    end;
	 end
 else
   begin
	  if (s[linha]) then
	    begin
		 write('');
		 write(s);
		 write('');
	    end;
   end;

 readkey;
end.

Eis os 3 erros:

linhas 78:21;78:30; 88:17 -> illegal qualifier
Edited by carcleo
Posted (edited)

Não sei se já reparaste, mas as linhas que referiste não existem no código que colocaste (EDIT: se calhar é o famoso bug do fórum em acção novamente). De qualquer modo, estás a tentar aceder à variável s como se esta fosse uma array de strings, quando na realidade não o é (s é um file of string).

Outro comentário: porquê file of string e não simplesmente text?

PS.: Não estive a ver o resto do código, apenas comentei o erro.

Edited by pwseo
Posted (edited)

Na verdade, estou dando 'tiro' pra tudo quanto é lado pra ver se acerto.

Olha como esta agora:

{
 1a Questão (3,0 pontos) (Arquivo Texto)
 Faça um programa em Pascal que processe dois arquivos texto, incluindo o segundo arquivo no primeiro a partir de uma linha escolhida.
 Seu programa deve, inicialmente, pedir ao usuário os nomes dos arquivos, garantindo nomes distintos.
 Em seguida, deve pedir ao usuário qual é a linha do primeiro arquivo depois da qual as linhas do segundo arquivo deverão ser inseridas.
 Seu programa também deve mostrar na tela os conteúdos dos dois arquivos originais.
 Em seguida, deve mostrar o conteúdo do primeiro arquivo modificado pela inclusão.
 Caso algum arquivo não exista, crie-o com conteúdo vazio e, caso a linha de inserção não exista, crie linhas vazias até aquela linha escolhida, incluindo o segundo arquivo a partir dali.
}
program arquivo;
uses Crt;
var
 primeiro, segundo: string;
 p,s: file of string;
 i, linha:integer;
function FileExists(Filename:String):Boolean;
var
  f:File;
begin
  Assign(F,FileName);
  {$I-}
  Reset(F);
  {$I+}
  FileExists:=IOResult=0;
end;
begin
 writeLn('Ola.');
 writeLn('Faremos dois arquivos para inserirmos o conteudo do segundo arquivo no meio do primeiro');
 writeLn('Apos digitar o nome dos dois arquivos, popr favor, sigite a linha do primeiro arquivo arvivo a partir da qual, o segundo entrará');
 writeLn('Detalhe: escolha nomes de arquivos não existentes em seu sistemas');
 writeLn ('Escreva um nome para criarmos o primeiro arquivo: ');
 readLn(primeiro);
 primeiro:= primeiro+'.txt';

 assign(p, primeiro);  {Atrela a variavel 'p' ao nome do primeiro arquivo}
 rewrite(p);
 reset(p);
 if FileExists(primeiro)=false then
  begin
for i:=1 to 10 do
	 begin
	   write (primeiro, random(10));
	 end;
  end;
 writeLn ('Escreva um nome para criarmos o segundo arquivo: ');
 readLn(segundo);
 segundo:= segundo+'.txt';
 if (primeiro=segundo) then
  begin
writeLn('O nome do segundo ficheiro é igual ao do primeiro. Introduza outro nome:')
  end
 else
  begin
assign(s, segundo);  {Atrela a variavel 's' ao nome do segundo arquivo}
rewrite(s);
reset(s);
if IOResult<>0 then
	 begin
	  for i:=1 to 10 do
	   begin	  
			assign(s, segundo);  {Atrela a variavel 's' ao nome do segundo arquivo}
			reset(s);
			write (segundo, random(10));
	   end;
	 end;
writeLn('Digite a linha a partir da qual o segundo arquivo entrara no meio do primeiro');
readLn(linha);
  end;
if (filesize(p)<linha) then
	 begin
	   for i:=1 to linha do
		begin
		  if (linha=i) then
			begin
			 write('');
			 write(s[linha],p);
			 write('');
			end;
		end;
	 end
 else
   begin
		 write('');
		 write(s[linha],p);
		 write('');
   end;

 readkey;
end.
Edited by carcleo
Posted (edited)

carcleo,

Se calhar devias tentar resolver o teu problema de uma forma incremental: começa por fazer um programa que leia os dois nomes e imprima os ficheiros no ecrã. De seguida, certifica-te que os nomes não são iguais. Detecta quando o ficheiro não existe (para o criares sem nada). Depois pensa como farás para escrever a meio do primeiro ficheiro todo o conteúdo do segundo.

Relativamente ao código que colocaste, deixa-me fazer os seguintes comentários:

  • Ao fazeres rewrite(p) estás a abrir o ficheiro e a limpá-lo. Consequentemente, FileExists(primeiro) nunca será false e ele nunca será preenchido com 10 números ao acaso.
  • Quando verificas se primeiro = segundo falta-te um mecanismo para voltar a pedir o nome do 2º ficheiro ao utilizador. Penso que já te explicaram isto anteriormente.
  • Mais uma vez, ao fazeres rewrite(s) estás a limpar tudo o que existe no 2º ficheiro.
  • ...

Não vi mais. Esclarece-me: qual é o comportamento do teu programa neste momento? Quando o compilas e o executas com 2 ficheiros um.txt e dois.txt cada um com 5 linhas contendo os números de 1..5 e 6..10 (respectivamente) e é pedido para inserir o 2º ficheiro após a 3ª linha do primeiro?

Output de referência:

1º ficheiro? um.txt
2º ficheiro? dois.txt

um.txt:
1
2
3
4
5

dois.txt:
6
7
8
9
10

resultado (um.txt):
1
2
3
6
7
8
9
10
4
5

Relembro que o resultado deve ficar guardado no primeiro ficheiro.

Edited by pwseo
Posted

veja se melhorou:

{
 1a Questão (3,0 pontos) (Arquivo Texto)
 Faça um programa em Pascal que processe dois arquivos texto, incluindo o segundo arquivo no primeiro a partir de uma linha escolhida.
 Seu programa deve, inicialmente, pedir ao usuário os nomes dos arquivos, garantindo nomes distintos.
 Em seguida, deve pedir ao usuário qual é a linha do primeiro arquivo depois da qual as linhas do segundo arquivo deverão ser inseridas.
 Seu programa também deve mostrar na tela os conteúdos dos dois arquivos originais.
 Em seguida, deve mostrar o conteúdo do primeiro arquivo modificado pela inclusão.
 Caso algum arquivo não exista, crie-o com conteúdo vazio e, caso a linha de inserção não exista, crie linhas vazias até aquela linha escolhida, incluindo o segundo arquivo a partir dali.
}
program arquivo;
uses Crt;
var
 primeiro, segundo: string;
 p,s: file of string;
 i, linha:integer;
function FileExists(Filename:String):Boolean;
var
  f:File;
begin
  Assign(F,FileName);
  {$I-}
  Reset(F);
  {$I+}
  FileExists:=IOResult=0;
end;
begin
 writeLn('Ola.');
 writeLn('Faremos dois arquivos para inserirmos o conteudo do segundo arquivo no meio do primeiro');
 writeLn('Apos digitar o nome dos dois arquivos, popr favor, sigite a linha do primeiro arquivo arvivo a partir da qual, o segundo entrará');
 writeLn('Detalhe: escolha nomes de arquivos não existentes em seu sistemas');
 writeLn ('Escreva um nome para criarmos o primeiro arquivo: ');
 readLn(primeiro);
 primeiro:= primeiro+'.txt';
 assign(p, primeiro);  {Atrela a variavel 'p' ao nome do primeiro arquivo}
 if FileExists(primeiro)=false then
  begin
   rewrite(p);
   reset(p);
   for i:=1 to 10 do
	 begin
	   write (primeiro, random(10));
	 end;
  end;

 writeLn ('Escreva um nome para criarmos o segundo arquivo: ');
 readLn(segundo);
 segundo:= segundo+'.txt';
 if (primeiro=segundo) then
  begin
   writeLn('O nome do segundo ficheiro é igual ao do primeiro. Introduza outro nome:')
  end
 else
  begin
   assign(s, segundo);  {Atrela a variavel 's' ao nome do segundo arquivo}
   if FileExists(primeiro)=false then
  begin
   rewrite(s);
   reset(s);
   for i:=1 to 10 do
	 begin
	   write (segundo, random(10));
	 end;
  end;
   writeLn('Digite a linha a partir da qual o segundo arquivo entrara no meio do primeiro');
   readLn(linha);
  end;
  {
   if (filesize(p)<linha) then
	 begin
	   for i:=1 to linha do
	    begin
		  if (linha=i) then
		    begin
			 write('');
			 write(s[linha],p);
			 write('');
		    end;
	    end;
	 end
 else
   begin
		 write('');
		 write(s[linha],p);
		 write('');
   end;
   }
 readkey;
end.
Posted

Carcleo, desculpa a franqueza... mas... um prof. meu quando deu um trabalho daqueles cabeludos e nos ouviu a reclamar preguntou-nos: Sabem como é que se come um elefante? -Um bocadinho de cada vez.

Pelo que me apercebi isto é um elefante muito grande para ti, portanto segue o concelho do Pwseo

Se calhar devias tentar resolver o teu problema de uma forma incrementa

Repara, expliquei-te 2 vezes o erro quando pedias o nome do ficheiro. Dei-te exemplos. Não usas-te o repeat o que me leva a crer que nem sequer o sabes usar, e continuas a cometer os mesmos erros

Essa parte:

Código (Pascal):

while FileExists(concat(primeiro,'.txt'))=true do

begin

writeLn('Esse arquivo ja existe. Por favor escolha outro nome');

end;

Pensei que fosse assim:

O cara digitou o nome do ficheiro. Ele jha existe, exibe a mensagem e espera ele digitar de novo o nome do ficheiro.

Após ele colocar um nome ainda não existe ai salta para fora do while.

Portanto, esquece tudo o que fizeste. Vou-te dar a sequência do programa, só deves de passar para ponto seguinte depois de resolveres o ponto em que estás:

1. Pedir nome do 1º ficheiro sem sair do programa até ser dado um válido;

2. Pedir nome do 2º ficheiro sem sair do programa até ser dado um válido;

3. Criar e mostrar o 1º ficheiro;

4. Criar e mostrar o 2º ficheiro;

5. Pedir nº da linha até ser dado um nº válido. (menor que o nº de linhas do 1º ficheiro)

6. Cria um 3º ficheiro para colocares o resultado

7.1. Copia as linhas do 1º para o 3º ficheiro até ao nº de linha pedido no ponto 5

7.2. Copia todo o 2º ficheiro para o 3º

7.3. Copia as restante linhas do 1º para o 3º ficheiro

8. Mostra o 3º ficheiro

Nota: Não passes de um ponto para o outro sem fechares os ficheiros excepto dentro dos pontos 7.x

Não te preocupes com o 3º ficheiro, a seu tempo explico-te o método, agora só te iria confundir!

Vais ver que se vai tornar mais fácil, tens é de trabalhar um bocadito!

Posted (edited)

Os repeat's ficariam assim?

program arquivos;
type
 arquivo= file of char;
 inteiro = integer;
 texto= string;
var
 primeiro, segundo: texto;
 i, num_linhas_segundo, linha: inteiro;
 p,s: arquivo;
 j:char;
function FileExists(Filename:String):Boolean;
var
  f:File;
begin
  Assign(F,FileName);
  {$I-}
  Reset(F);
  {$I+}
  FileExists:=IOResult=0;
end;
Begin
 writeLn('Ola.');
 writeLn('Faremos dois arquivos para inserirmos o conteudo do segundo arquivo no meio do primeiro');
 writeLn('Apos digitar o nome dos dois arquivos, popr favor, sigite a linha do primeiro arquivo arvivo a partir da qual, o segundo entrará');
 writeLn('Detalhe: escolha nomes de arquivos não existentes em seu sistemas');
 writeLn('Digite o nome do primeiro arquivo');
 readLn(primeiro);
 primeiro:=primeiro+'.txt';
 if(FileExists(primeiro)=true) then
  begin
   repeat
  primeiro:='';
  writeLn('Arquivo existente. Digite outro nome:');
  writeLn(primeiro);
  primeiro:=primeiro+'.txt';
   until FileExists(primeiro)=false;
  end;
 writeLn('Digite o nome do segundo arquivo');
 readLn(segundo);
 primeiro:=segundo+'.txt';  
 if(FileExists(segundo)=true) then
  begin
   repeat
  segundo:='';
  writeLn('Arquivo existente ou o nome do primeiro igual ao segundo. Digite outro nome:');
  writeLn(segundo);
  segundo:=segundo+'.txt';
   until FileExists(segundo)=false;
 //until FileExists(segundo)=false and primeiro<>segundo;
 end;
 assign(p, primeiro);  {Atrela a variavel 's' ao nome do segundo arquivo}
 assign(s, segundo);  {Atrela a variavel 's' ao nome do segundo arquivo}
 reset(p);
 reset(s);
 write(p);
 writeLn(' ');
 write(s);
 num_linhas_segundo:=0;
 writeLn('Digite a linha a partir da qual o segundo arquivo entrara no meio do primeiro');
 readLn(linha);
 for j:='A' to 'Z' do
 begin
	 write(p, j);
  end;
 if (num_linhas_segundo<linha) then
   begin
  for i:=num_linhas_segundo+1 to linha do
    begin
	   write(s, 'A');
    end;
   end;
 writeLn(' ');
 write(s);
End.

Outra coisa: Como conto o numero de linhas que tem um arquivo?

Edited by carcleo
Posted

Não te esqueceste de colocar a instrução que lê os nomes?

Mas não é este o único erro -- já compilaste o código? Testaste o seu funcionamento?

Quanto à "outra coisa": para contar o número de linhas é necessário uma variável para armazenar esse número; depois basta ler as linhas uma a uma e ir incrementando a variável.

Posted (edited)

Epá, isto está a ser dificil... está-me a dar a sensação de estar a escrever pró boneco!

Ultima vez!

Este é o teu código:

readLn(primeiro);

primeiro:=primeiro+'.txt';

repeat

primeiro:='';

writeLn('Arquivo exsitente. Digite outro nome:');

primeiro:=primeiro+'.txt';

until FileExists(primeiro)=false;

Dentro deste repeat until pedes para o utilizador digitar outro nome, mas não lhe dá esse comando

Teu código modificado:

readLn(primeiro); //Isto vai passar para dentro do ciclo repeat

primeiro:=primeiro+'.txt'; //Isto não necessitas

repeat

readLN(primeiro);

primeiro:=''; //Isto não necessitas

primeiro:=primeiro+'.txt'; //troquei esta linha com a debaixo pq tens de fazer 1º a atribuição antes do if

if not FileExists(primeiro) then writeLn('Arquivo exsitente. Digite outro nome:');

until FileExists(primeiro)=false;

Edited by passarito
Posted

carcleo,

Realmente editaste entretanto o post.

Não existe um comando para saber em que linha estás. Existe, no entanto, criatividade e engenho (leia-se: ler linha a linha e incrementar um contador).

Antes de terminar, volto a fazer-te a pergunta que fiz: compilaste o teu programa? testaste-o? qual é o seu comportamento?

Posted (edited)

Sim, compilei. O resultado foi o seguinte

Bom, eu fiz\ assim:

aa.png

Detalhe: O arquivo não existe na pasta

writeLn('Resultado: ',FileExists(primeiro));
 if FileExists(primeiro) then
  begin
   repeat
  primeiro:=''; //Aqui, é pra limpar o valor da varivel primeiro para um novo valor
  writeLn('Arquivo existente1. Digite outro nome:');
  writeLn(primeiro);
  primeiro:=primeiro+'.txt';
   until FileExists(primeiro)=false;
  end;

O que esta a acontece: Mesmo o resultado da primeiro sendo false, esta entrando no if do mesmo jeito

Edited by carcleo
Posted

Detalhe: O arquivo não existe na pasta

writeLn('Resultado: ',FileExists(primeiro));
 if FileExists(primeiro) then
  begin
repeat
  primeiro:=''; //Aqui, é pra limpar o valor da varivel primeiro para um novo valor
  writeLn('Arquivo existente1. Digite outro nome:');
  writeLn(primeiro);
  primeiro:=primeiro+'.txt';
until FileExists(primeiro)=false;
  end;

O que esta a acontece: Mesmo o resultado da primeiro sendo false, esta entrando no if do mesmo jeito

I GIVE UP !!!! 😕

Posted

RIP passarito, percebo-te perfeitamente.

carcleo, como já te disse anteriormente, resolve o problema de forma incremental. Vi um dos teus posts anteriores e tens definição de tipos de dados personalizados, não percebo por alma de que santo isso é preciso.

Pega nisto:

program arquivos;

var
 nome1, nome2: string;
 f1, f2: text;
begin
 { para ser preenchido por ti }
end.

A partir desse código que coloquei, resolve o problema um bocadinho de cada vez. Primeiro tratas de fazer com que o programa peça 2 nomes de ficheiro e se certifique que existem (mesmo que seja preciso criá-los para isso) e que são nomes diferentes.

Depois modificas o programa para mostrar os ficheiros no ecrã após pedir os nomes ao utilizador.

E só depois tratas de modificar para pedir ao utilizar uma linha após a qual o 2º ficheiro será introduzido no 1º ficheiro. Farás isto com recurso a um 3º ficheiro (temporário).

Alguma dúvida?

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.