0
votes

I created text file using pascal, wrote to that text file some lines with numbers and now I'm trying to read the first line of text file and pascal giving me error BAD NUMBER FORMAT.

Here's code:

program Text_files;
{
procedure CreateFile(f1:string);
var f:text;
    x,x1,n:integer;
begin
    assign(f,f1);
    rewrite(f);
    n:=1;
        for x1:= 1 to 5 do
        begin
            for x:= 1 to 20 do
                begin
                    write(f,n,' ');
                    n:=n+1;
                end;
        writeln(f);
        end;
    close(f);
end;
}
procedure ReadFile(f1:string);
var f:text;
    n:integer;
    begin
        assign(f,f1);
        reset(f);
                while not eoln(f) do
                begin
                    read(f,n);
                    write(n,' ');
                end;
        close(f);
    end;
begin
  //CreateFile('NewFile.txt');
  ReadFile('NewFile.txt');
  Readln;
end.

I tried to change n variable to string type and it worked i read the first line of text file, but I want that read data to be integer type. What is the problem?

NewFile.txt DATA:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 
61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 
81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 
2
freepascal (2.6.x under windows) will print 1 .. 100 followed by 0. IOW it works mostly fine. EOLN never returns true in this case. You'll probably want EOF in there somewhere too. - Marco van de Voort
Then tell me how I can read a line of numbers into an integer type variable? - Giancarlo
I found out that when you write data, ie:numbers, to a text file with Pascal, it writes that data as a string type, that's why when you're trying to read those numbers as a integer type, you get an error. Correct me if I'm tallking nonsense. :) - Giancarlo
It depends on the file type. Change "text" to "file of integer" and see what happens - Marco van de Voort
I get an error Incompatible type for arg. no. 1: Got File Of SMALLINT, expected TEXT. Or I'm doing something wrong.. - Giancarlo

2 Answers

1
votes

You can not read numbers when you open a text file. Even if you'd try to read it as a file of records it wouldn't work because those records don't have the same length. 1 is just on byte in size and 100 is three bytes. Additionally you have the spaces and probably EOLs. So, you would have to change the

procedure CreateFile(f1:string);
var f:file of integer;
    x,x1,n:integer;
begin
    assign(f,f1);
    rewrite(f);
    n:=1;
    for x1:= 1 to 100 do
    begin
       write(f,x1);
    end;
    close(f);
end;

And then

procedure ReadFile(f1:string);
var f:file of integer;
    n:integer;
begin
    assign(f,f1);
    reset(f);
    while not eof(f) do
    begin
        read(f,n);
        write(n,' ');
    end;
    close(f);
end;
begin
  CreateFile('NewFile.txt');
  ReadFile('NewFile.txt');
end.

This should solve your problem. But it has a drawback: the file-contents are not human readable. If that matters to you for some reason you have to do it the hard way. I.e. you keep your version of CreateFile and rewrite only ReadFile

procedure ReadFile(f1:string);
    procedure getNumsFromString(s:string);
    var
       sTmp: string;
       iPos: integer;
       i   : integer;
    begin
       repeat
          iPos=pos(#32,s);
          sTmp=copy(s,1,iPos);
          s=copy(s,iPos+1,length(s));
          i=strtoInt(sTmp);
          write(i,#32);
       until (length(s)=0); 
    end;
var f:text;
    s:string;
begin
    assign(f,f1);
    reset(f);
    while not eof(f) do
    begin
       read(f,s);
       getNumsFromString(s);
       writeln();
    end;
    close(f);
end;

the code is untested but you get the idea. Hope it helps

-2
votes
Procedure Reading;
Var
   n: longint;
Begin
 assign(input,'NewFile.txt');
 reset(input);
 While not EoF{EoLn} do
  begin
    read(n);
    write(n,' '); 
  end;   
End;