Como salvar um arquivo de texto com o delphi sem ele pular linhas

10/04/2023

0

salve galera, eu tô querendo gerar 20 mil numeros no delphi e salvar todos ele em um arquivo de texto, porém sempre que eu salvo ele sai com o número e então pulando uma linha, exemplo:
1
4
6
eu tô tentando fazer com que fique :146. Ou até mesmo separados por uma virgula, oque importa é manter eles conectados. Eis o código:
procedure TForm1.Button1Click(Sender: TObject);
var
int : Integer;
i : Integer;
MyText: TStringlist;
begin
MyText:= TStringlist.create;
for i := 1 to 20000 do
begin
int := 1 + Random(10);
MyText.add(inttostr(int));
end;
try
MyText.SaveToFile('c:\filename.txt');
finally
MyText.Free
end;
end;
end.
Aníbal

Aníbal

Responder

Post mais votado

11/04/2023

Voce provavelmente pensou na classe TStringList pela facilidade de salvar o conteúdo ao final.

Porém, o que voce quer fazer é concatenar um texto, o que poderia ser melhor executado usando uma variável do tipo String.

Ou, pode abrir o arquivo da forma tradicional e escrever o conteúdo diretamente.

[code]
procedure savenumbers(n : integer; filename : string);
var
i : integer;
f : textfile;
begin
assign(f,filename);
rewrite(f);
write(f,1+random(10));
for i:=2 to n do
write(f,',',i+random(10));
writeln(f);
closefile(f);
end;
eu até faria manualmente e escreveria os números se não fossem 20 mil números para escrever então a preguiça batekkkkk, mas eu tentei utilizar o código que você passou e ainda sim os números saem em linhas, sou novo no delphi e acho que tô fazendo besteira


A rotina que eu passei utiliza a função "write" para escrever as linhas no arquivo. Esta função não adiciona a quebra de linha após o valor.
Ao final do loop, utilizei um "writeln" que escreve a quebra de linha uma única vez no arquivo.

Não sei como você está visualizando o conteúdo do arquivo, após gerado. Pode ser que a quebra esteja ocorrendo durante a visualização.

Arthur Heinrich

Arthur Heinrich
Responder

Mais Posts

11/04/2023

Arthur Heinrich

Voce provavelmente pensou na classe TStringList pela facilidade de salvar o conteúdo ao final.

Porém, o que voce quer fazer é concatenar um texto, o que poderia ser melhor executado usando uma variável do tipo String.

Ou, pode abrir o arquivo da forma tradicional e escrever o conteúdo diretamente.

[code]
procedure savenumbers(n : integer; filename : string);
var
i : integer;
f : textfile;
begin
assign(f,filename);
rewrite(f);
write(f,1+random(10));
for i:=2 to n do
write(f,',',i+random(10));
writeln(f);
closefile(f);
end;
Responder

11/04/2023

Arthur Heinrich

procedure savenumbers(n : integer; filename : string);
var
  i : integer;
  f : textfile;
begin
  assign(f,filename);
  rewrite(f);
  write(f,1+random(10));
  for i:=2 to n do
    write(f,',',i+random(10));
  writeln(f);
  closefile(f);
end;
Responder

11/04/2023

Arthur Heinrich

Ao utilizar a função Random() é importante lembrar de chamar a função "randomize" na inicialização do programa, para que ela alimente a semente aleatória.

Do contrário, sempre que rodar o programa obterá os mesmos valores.
Responder

11/04/2023

Aníbal

Ao utilizar a função Random() é importante lembrar de chamar a função "randomize" na inicialização do programa, para que ela alimente a semente aleatória.

Do contrário, sempre que rodar o programa obterá os mesmos valores.
então, eu testei sem a função randomize e sempre que eu rodava para salvar o arquivo a sequência mudava, não sei se o delphi tá colocando por padrão isso da sequência mudar mas pelo menos aqui, ele não fica dando a mesma sequência
Responder

11/04/2023

Aníbal

Voce provavelmente pensou na classe TStringList pela facilidade de salvar o conteúdo ao final.

Porém, o que voce quer fazer é concatenar um texto, o que poderia ser melhor executado usando uma variável do tipo String.

Ou, pode abrir o arquivo da forma tradicional e escrever o conteúdo diretamente.

[code]
procedure savenumbers(n : integer; filename : string);
var
i : integer;
f : textfile;
begin
assign(f,filename);
rewrite(f);
write(f,1+random(10));
for i:=2 to n do
write(f,',',i+random(10));
writeln(f);
closefile(f);
end;
eu até faria manualmente e escreveria os números se não fossem 20 mil números para escrever então a preguiça batekkkkk, mas eu tentei utilizar o código que você passou e ainda sim os números saem em linhas, sou novo no delphi e acho que tô fazendo besteira
Responder

11/04/2023

Arthur Heinrich

Ao utilizar a função Random() é importante lembrar de chamar a função "randomize" na inicialização do programa, para que ela alimente a semente aleatória.

Do contrário, sempre que rodar o programa obterá os mesmos valores.
então, eu testei sem a função randomize e sempre que eu rodava para salvar o arquivo a sequência mudava, não sei se o delphi tá colocando por padrão isso da sequência mudar mas pelo menos aqui, ele não fica dando a mesma sequência


A função Randomize serve para preencher a variável RandSeed. Uma vez iniciado o programa, a cada vez que chamamos a função Random, a rotina utiliza a variável RandSeed para gerar o valor pseudo-aleatório e atualizada a RandSeed.

Desta forma, se você não sai do programa e só pressiona seu botão múltiplas vezes, é como se a rotina continuasse a sequência anterior, gerando números distintos.

Porém, se você sai do programa e o executa novamente, provavelmente as sequências se repetirão.
Responder

11/04/2023

Aníbal

Voce provavelmente pensou na classe TStringList pela facilidade de salvar o conteúdo ao final.

Porém, o que voce quer fazer é concatenar um texto, o que poderia ser melhor executado usando uma variável do tipo String.

Ou, pode abrir o arquivo da forma tradicional e escrever o conteúdo diretamente.

[code]
procedure savenumbers(n : integer; filename : string);
var
i : integer;
f : textfile;
begin
assign(f,filename);
rewrite(f);
write(f,1+random(10));
for i:=2 to n do
write(f,'','',i+random(10));
writeln(f);
closefile(f);
end;
eu até faria manualmente e escreveria os números se não fossem 20 mil números para escrever então a preguiça batekkkkk, mas eu tentei utilizar o código que você passou e ainda sim os números saem em linhas, sou novo no delphi e acho que tô fazendo besteira


A rotina que eu passei utiliza a função "write" para escrever as linhas no arquivo. Esta função não adiciona a quebra de linha após o valor.
Ao final do loop, utilizei um "writeln" que escreve a quebra de linha uma única vez no arquivo.

Não sei como você está visualizando o conteúdo do arquivo, após gerado. Pode ser que a quebra esteja ocorrendo durante a visualização.
eu estou utilizando o programa de texto do windows, eu tenho que substituir a função tstringlist pela write? eu não entendi muito bem, só tentei adicionar seu código ao meu e fazer alguns ajustes
Responder

11/04/2023

Arthur Heinrich

eu estou utilizando o programa de texto do windows, eu tenho que substituir a função tstringlist pela write? eu não entendi muito bem, só tentei adicionar seu código ao meu e fazer alguns ajustes


São duas abordagens diferentes. Ou você abandona a utilização da classe TStringList e escreve os valores diretamente no arquivo, como no meu exemplo. Ou precisa concatenar os números corretamente no TStringList.

Ao utilizar o TStringList, sempre que você faz MyText.add(inttostr(int));, está "adicionando" uma nova linha à lista. Por isso está havendo a quebra.

Você pode fazer uma "gambiarra", substituindo a linha MyText.add(inttostr(int)); por:

MyText.text := MyText.text + inttostr(int);
ou
MyText[0] := MyText[0] + inttostr(int);

Porém, em ambos os casos o desempenho será prejudicado, visto que o TStringList não foi criado com este propósito.
Responder

11/04/2023

Aníbal

eu estou utilizando o programa de texto do windows, eu tenho que substituir a função tstringlist pela write? eu não entendi muito bem, só tentei adicionar seu código ao meu e fazer alguns ajustes


São duas abordagens diferentes. Ou você abandona a utilização da classe TStringList e escreve os valores diretamente no arquivo, como no meu exemplo. Ou precisa concatenar os números corretamente no TStringList.

Ao utilizar o TStringList, sempre que você faz MyText.add(inttostr(int));, está "adicionando" uma nova linha à lista. Por isso está havendo a quebra.

Você pode fazer uma "gambiarra", substituindo a linha MyText.add(inttostr(int)); por:

MyText.text := MyText.text + inttostr(int);
ou
MyText[0] := MyText[0] + inttostr(int);

Porém, em ambos os casos o desempenho será prejudicado, visto que o TStringList não foi criado com este propósito.
se fosse para abandonar o tstring, cm eu teria q fazer? Realmente não entendi, desculpa
Responder

11/04/2023

Arthur Heinrich

se fosse para abandonar o tstring, cm eu teria q fazer? Realmente não entendi, desculpa


Neste caso, você pode usar a rotina que eu enviei.

procedure savenumbers(n : integer; filename : string);
var
  i : integer;
  f : textfile;
begin
  assign(f,filename);
  rewrite(f);
  write(f,1+random(10));
  for i:=2 to n do
    write(f,',',i+random(10));
  writeln(f);
  closefile(f);
end;


Para trabalhar com arquivos, o SO utiliza file handles. Internamente, a linguagem Pascal utiliza dois tipos de variáveis para isso: "textfile", para arquivos do tipo texto e "file" para arquivos binários.

Utilizamos o AssignFile() para associar um nome de arquivo à variável. Em seguida, a rotina cria o arquivo chamando a função "rewrite". Se tivéssemos que abrir um arquivo para leitura, utilizaríamos "reset" ou para continuar a gravação ao final do arquivo, "append".

A função write() ou writeln(), normalmente escreve dados para o console (standard output). Porém, ela permite que informemos como primeiro parâmetro, uma variável de arquivo, escrevendo os valores diretamente no arquivo informado. A diferença entre elas é que writeln() quebra a linha após a escrita, inserindo os caracteres return (#13) e line feed (#10) (no padrão DOS/Windows).

Ao final, o arquivo precisa ser fechado, o que é feito com a função close(), ou closefile(), que foi criada para não dar conflico com o método close, que fecha o form ou outros tipos de classes.

No exemplo acima, eu informei a quantidade de números e o nome do arquivo via parâmetro.

Para simular o seu exemplo, ela deveria ser chamada assim:

savenumbers(20000, 'c:\\filename.txt');
Responder

11/04/2023

Aníbal

se fosse para abandonar o tstring, cm eu teria q fazer? Realmente não entendi, desculpa


Neste caso, você pode usar a rotina que eu enviei.

procedure savenumbers(n : integer; filename : string);
var
  i : integer;
  f : textfile;
begin
  assign(f,filename);
  rewrite(f);
  write(f,1+random(10));
  for i:=2 to n do
    write(f,'','',i+random(10));
  writeln(f);
  closefile(f);
end;


Para trabalhar com arquivos, o SO utiliza file handles. Internamente, a linguagem Pascal utiliza dois tipos de variáveis para isso: "textfile", para arquivos do tipo texto e "file" para arquivos binários.

Utilizamos o AssignFile() para associar um nome de arquivo à variável. Em seguida, a rotina cria o arquivo chamando a função "rewrite". Se tivéssemos que abrir um arquivo para leitura, utilizaríamos "reset" ou para continuar a gravação ao final do arquivo, "append".

A função write() ou writeln(), normalmente escreve dados para o console (standard output). Porém, ela permite que informemos como primeiro parâmetro, uma variável de arquivo, escrevendo os valores diretamente no arquivo informado. A diferença entre elas é que writeln() quebra a linha após a escrita, inserindo os caracteres return (#13) e line feed (#10) (no padrão DOS/Windows).

Ao final, o arquivo precisa ser fechado, o que é feito com a função close(), ou closefile(), que foi criada para não dar conflico com o método close, que fecha o form ou outros tipos de classes.

No exemplo acima, eu informei a quantidade de números e o nome do arquivo via parâmetro.

Para simular o seu exemplo, ela deveria ser chamada assim:

savenumbers(20000, ''c:\\\\\\\\filename.txt'');
então o código teria que ficar assim?:
procedure TForm1.Button1Click(Sender: TObject);
var
int : Integer;
i : Integer;
MyText: TStringlist;
begin
MyText:= TStringlist.create;
for i := 1 to 20 do
begin
int := 1 + Random(10);
MyText.add(inttostr(int));
end;
try
MyText.SaveToFile(''c:\\\\filename.txt'');
finally
MyText.Free
end;
end;
end.
procedure savenumbers(20 : ''c:\\\\\\\\filename.txt'': : string);
var
i : integer;
f : textfile;
begin
assign(f,filename);
rewrite(f);
write(f,1+random(10));
for i:=2 to n do
write(f,'','',i+random(10));
writeln(f);
closefile(f);
end;
end.

eu tentei fazer com o exemplo que você me passou mas como o texto é salvo via um botão eu não sei muito bem como conectar o procedure savenumbers com o tform
Responder

12/04/2023

Arthur Heinrich

procedure savenumbers(n : integer; filename : string);
var
  i : integer;
  f : textfile;
begin
  assign(f,filename);
  rewrite(f);
  write(f,1+random(10));
  for i:=2 to n do
    write(f,',',i+random(10));
  writeln(f);
  closefile(f);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  savenumbers(20000, 'c:\\\\filename.txt');
end;

Responder

12/04/2023

Aníbal

procedure savenumbers(n : integer; filename : string);
var
  i : integer;
  f : textfile;
begin
  assign(f,filename);
  rewrite(f);
  write(f,1+random(10));
  for i:=2 to n do
    write(f,',',i+random(10));
  writeln(f);
  closefile(f);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  savenumbers(20000, 'c:\\\\\\\\filename.txt');
end;

obrigado por toda a sua ajuda e paciência!
Responder

APRENDA A PROGRAMAR DO ZERO AO PROFISSIONAL

Assitir aula

Saiba por que programar é uma questão de
sobrevivência e como aprender sem riscos

Assistir agora

Utilizamos cookies para fornecer uma melhor experiência para nossos usuários, consulte nossa política de privacidade.

Aceitar