Como salvar um arquivo de texto com o delphi sem ele pular linhas
10/04/2023
0
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
Post mais votado
11/04/2023
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;
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
Mais Posts
11/04/2023
Arthur Heinrich
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;
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;
11/04/2023
Arthur Heinrich
Do contrário, sempre que rodar o programa obterá os mesmos valores.
11/04/2023
Aníbal
Do contrário, sempre que rodar o programa obterá os mesmos valores.
11/04/2023
Aníbal
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;
11/04/2023
Arthur Heinrich
Do contrário, sempre que rodar o programa obterá os mesmos valores.
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.
11/04/2023
Aníbal
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;
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.
11/04/2023
Arthur Heinrich
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.
11/04/2023
Aníbal
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.
11/04/2023
Arthur Heinrich
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');
11/04/2023
Aníbal
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'');
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
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;
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;
Clique aqui para fazer login e interagir na Comunidade :)