peteyj
asked on
Readln Problem
When I use the Readln procedure to read a line from a text file, everything goes ok. But when I use it within a loop to read the body of the text it gives me everything but when there's a empty line (or simply a couple of carraige returns, whatever) it doesn't give back a result. So when I'm writing to an array of strings, it acts like it skips all carraige returns. Does anyone know how to resolve this or a better procedure to use. Any tips would be helpful.
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
Using Writeln, I am also getting errors. Any suggestions for these? And how many strings can I have in a stringlist?
Submit the code so we can have a look!
/// John
/// John
A StringList Should be able to hold 32767,
but I have never tried to hold that many.
Does the ReadLn code work?
but I have never tried to hold that many.
Does the ReadLn code work?
ASKER
The readln procedures are working ok, but now the writeln still aren't. Here's the code if anyone can take a crack at it.
function TMainForm.OverWriteTextFil e(SatFileN ame: String;
SatRTextFile: RTextFile): Boolean;
var
SalTextFile : TextFile;
SalFileName : String;
SalRTextFile : RTextFile;
SalWriteString : String;
i : integer;
begin
Result := False;
SalFileName := SatFileName;
SalRTextFile := SatRTextFile;
AssignFile(SalTextFile, SalFileName);
try
Rewrite(SalTextFile);
except on EInOutError do
begin
CloseFile(SalTextFile);
Result := False;
exit;
end;
end;
for i := 1 to 8192 do
begin
SalWriteString := SalRTextFile.OutputBuffer[ i];
if (SalWriteString <> '') then
begin
try
Writeln(SalTextFile, SalWriteString);
except on EInOutError do
begin
CloseFile(SalTextFile);
exit;
end;
end;
end;
end;
CloseFile(SalTextFile);
Result := True;
end;
All variables of type RTextFile are records, and InputBuffer and OutputBuffer are arrays of strings, which I plan to change to SringLists. If you've got any questions on anything else let me know.
function TMainForm.OverWriteTextFil
SatRTextFile: RTextFile): Boolean;
var
SalTextFile : TextFile;
SalFileName : String;
SalRTextFile : RTextFile;
SalWriteString : String;
i : integer;
begin
Result := False;
SalFileName := SatFileName;
SalRTextFile := SatRTextFile;
AssignFile(SalTextFile, SalFileName);
try
Rewrite(SalTextFile);
except on EInOutError do
begin
CloseFile(SalTextFile);
Result := False;
exit;
end;
end;
for i := 1 to 8192 do
begin
SalWriteString := SalRTextFile.OutputBuffer[
if (SalWriteString <> '') then
begin
try
Writeln(SalTextFile, SalWriteString);
except on EInOutError do
begin
CloseFile(SalTextFile);
exit;
end;
end;
end;
end;
CloseFile(SalTextFile);
Result := True;
end;
All variables of type RTextFile are records, and InputBuffer and OutputBuffer are arrays of strings, which I plan to change to SringLists. If you've got any questions on anything else let me know.
Sorry I have not responded for a while but I was on site in another City.
What error are you getting when you use the WriteLn?
If the problem is that it is not writing the blank lines then try
taking out the check "if the SalWriteString <> '' then".
Other than that it looks like your code sould work.
Here is a bit of code that will write a Memo to a text file
unit MyTextFile.Pas;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
function WriteTextFile(SatFileName: String; StringListToWrite: TStringList): Boolean;
var FileToWrite: TextFile;
I: Integer;
begin
AssignFile(FileToWrite, SatFileName);
//Add try finally to close the file
try
try
Rewrite(FileToWrite);
except
on EInOutError do
begin
Result := False;
Exit;
end;
end;
// for item in the StringList
for I := 0 to StringListToWrite.Count - 1 do
begin
try
//Write the line
Writeln(FileToWrite, StringListToWrite[I]);
except
on EInOutError do
begin
Result := False;
Exit;
end;
end;
end;
finally
CloseFile(FileToWrite);
end;
end;
procedure TForm1.Button1Click(Sender : TObject);
begin
WriteTextFile('C:\MyTextFi le.txt', TStringList(Memo1.Lines));
end;
end.
Try this out.
What error are you getting when you use the WriteLn?
If the problem is that it is not writing the blank lines then try
taking out the check "if the SalWriteString <> '' then".
Other than that it looks like your code sould work.
Here is a bit of code that will write a Memo to a text file
unit MyTextFile.Pas;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.DFM}
function WriteTextFile(SatFileName:
var FileToWrite: TextFile;
I: Integer;
begin
AssignFile(FileToWrite, SatFileName);
//Add try finally to close the file
try
try
Rewrite(FileToWrite);
except
on EInOutError do
begin
Result := False;
Exit;
end;
end;
// for item in the StringList
for I := 0 to StringListToWrite.Count - 1 do
begin
try
//Write the line
Writeln(FileToWrite, StringListToWrite[I]);
except
on EInOutError do
begin
Result := False;
Exit;
end;
end;
end;
finally
CloseFile(FileToWrite);
end;
end;
procedure TForm1.Button1Click(Sender
begin
WriteTextFile('C:\MyTextFi
end;
end.
Try this out.
/// John