Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Pascal] Текстовый файл и массив


Автор: TwisT_X 1.1.2007, 20:33
Вот задание:
создать текстовый файл, содержащий несколько строк цифр:
-подсчитать количество чисел в файле и заполнить этими числами одномерный массив.

Я код сделал:

Код

program RGZ2_Ox;
{$APPTYPE CONSOLE}
uses
  SysUtils;

var MyText: text;
    s2, s1, path: string;
    k, i, j: integer;
    mas: array [0..100] of string;

begin
     path:= 'c:\file.txt';
     assign(MyText, path);
     reset(mytext);
     repeat
          readln(mytext, s1);
          writeln(s1);
     until eof(mytext);
     s2:= ' ';
     j:= 0;
     k:= 0;
     mas[j]:= '';
     repeat
          readln(mytext, s1);
          for i:= 1 to length(s1) do
          begin
               if s1[i] in ['0'..'9'] then
               begin
                    s2:= s2 + s1[i];
                    mas[j]:= s2;
               end
               else
               begin
                    inc(j);
                    inc(k);
               end;
               s2:=' ';
          end;
     until eof(mytext);
     close(myText);
     for j:= 0 to 100 do
          write(mas[j], ' ');
     writeln('kol-vo 4isel - ', k);
     write('najmi ENTER dl9 zaverLLIenia..');
     readln;
end.


Но почемуто массив пустой и количество чисел тоже равно нулю..
Помагите плиз.. smile 

Автор: SoWa 1.1.2007, 20:57
Ой, как все сложно.
Код

var
f: text;
i: integer;
mas: array[1..32000] of byte;

begin
assign(f,'test.txt');
reset(f);
while not(eof(f)) do
 begin
  i:=i+1;
  read(f, mas[i]);
 end;
close(f);
end.

Автор: TwisT_X 1.1.2007, 21:13
SoWa, так нет.. в одной строке несколько чисел.. тогда не пройдет этот код..

Автор: SoWa 1.1.2007, 21:19
Ох. В каждой строке несколько цифр. Так? Без пробелов?
Чем же не пройдет? Я же read использую, я не readln
Как известно, read считывает один символ.
Приведи пример файла?

Автор: TwisT_X 1.1.2007, 21:31
138431 03464 161 3217 1321675 4654 897
64 498 5474 486 54 4698 534 46654647
32164 65432064679 3167944 46494554 47


ну вот так вот приверно!

Автор: SoWa 1.1.2007, 21:39
Ага. Приехали smile
Код

var 
f: text;
i,j: integer;
s,k: string;
mas: array[1..500] of string;
begin
Ля-ля-ля, сам знаешь
j:=0;
s:=''; k:='';
while not (eof ( f ) ) do
begin
readln(f,s);
for i:=1 to length(s) do
 begin
  if s[i]<>' ' then k:=k+s[i] else begin j:=j+1; mas[j]:=k; k:=''; end;
 end;
end;
end;

ИМХО лучше. Нету возможности проверить, ибо свежая винда еще без софта.
отрываешь народ от праздника =)

Автор: TwisT_X 1.1.2007, 21:52
SoWa, так ты что не проверила? не хочу огорчать.. но тоже самое - не хочет она писать результат на экран.. точнее пишет тока пробелы и ноль - количество чисел..

Автор: SoWa 1.1.2007, 21:59
Так. Во первых Я - не она. Я - ОН.
Во вторых. Ошибка у меня. Файл не прикрыл в конце. close(f);
Раз ничего не пишет, ошибка тут:
Код

for i:=1 to length(s) do
 begin
  if s[i]<>' ' then k:=k+s[i] else begin j:=j+1; mas[j]:=k; k:=''; end;
 end;

Хотя ошибок не вижу..
А вообще меня смущает функция eof.
Может из-за нее. Попробуй заменить ее на функцию поиска количества строк, и иди циклом по строкам. Может сканает. И еще попробуй трассировкой прогнать, погляди где чего.

Автор: TwisT_X 1.1.2007, 22:05
Извени что перепутал (он).  smile
я уже множество программ таких переделал.. и проблема помоему в том что тут дабавлены массивы..
если не они то все работает.. поэтому я собственно и обратился в "центр помощи". с функцией "еоф" всен намано.. короче тут какая то лажа.. может кто то другой подскажет?

Автор: SoWa 1.1.2007, 22:41
Вот. Стабильно работает!

Код

program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils;
var
f: text;
i,j: integer;
s,k: string;
mas: array[1..500] of string;

begin
assignfile(f,'f:\test.txt');
reset(f);

j:=0;
s:=''; k:='';
 while not (eof ( f ) ) do
  begin
  readln(f,s);
   for i:=1 to length(s)+1 do
    begin
     if (s[i]=' ')or(i=length(s)+1) then
     begin
           j:=j+1;
           mas[j]:=k;
           k:='';
    end
        else
           k:=k+s[i]
    end;
 end;
closefile(f);
writeln('kol-vo',j);
writeln('massiv');
for i:=1 to j do
 writeln(mas[i]);
readln;
end.

Автор: TwisT_X 1.1.2007, 23:07
SoWa, а зачем писать вот это:
or(i=length(s)+1) ?

Автор: apook 2.1.2007, 01:27
Вот мой аналог на С переводить ненкогда

Код

#include "stdio.h"
#include "stdlib.h"
#include "string.h"
#include "conio.h"
#include "ctype.h"

struct m
{
int *val;
int width;
};


long *fcalc( FILE *f )
{
char ch;
long i, j, c, *rtn;
fseek( f, 0, SEEK_SET );

for( i=0, j=0, c=0; ; i++ )
{
    ch =fgetc( f );
    if( ch =='\n' || ch ==EOF || ch =='\0' )
    {
        if( i >c ) c =i;
        if( ch==EOF && i==0 ) break;
        j++;
        i=0;
        }
    if( ch==EOF ) break;
    }

rtn[0]=j; /*количество строк */
rtn[1]=c; /*длина самой длинной строки*/
return rtn;
}



void main()
{
int i=0, j=0, c=0, q=0;
char  ch;

long *x=( long * ) malloc ( 2 ); 

FILE *f;
struct m matrix;


if( (f =(fopen( "Data.$$$", "r" ))) !=NULL );
else
{
    perror( "Error reading \n");
    exit(1);
    }

x[0]=0;
x[1]=0;
x =fcalc( f );


if( x[0] ==0 )
{
    printf( "File Length of zero: %s", "Data.$$$" );
    exit(1);
    }

fseek( f, 0, SEEK_SET );
for( i=0, j=0; i <x[0]; )
{
    ch =fgetc( f );
    if( ch =='\n' || ch ==EOF || ch =='\0' )
    {
        if( ch==EOF && i==0 ) break;
        i++;
        }
    else if( isdigit(ch) ) j++;
    if( ch==EOF ) break;
    }

matrix.width =j;
matrix.val =new int[matrix.width];
 
fseek( f, 0, SEEK_SET );

for( i=0, j=0; i <x[0]; )
{
    ch =fgetc( f );
    if( ch =='\n' || ch ==EOF || ch =='\0' )
    {
        if( ch==EOF && i==0 ) break;
        i++;
        }
    else if( isdigit(ch) )
    {
        matrix.val[j] =ch-48;
        j++;
        }
    if( ch==EOF ) break;
    }

matrix.val[j]='\0';




    for( i=0; i <matrix.width; i++ )
        printf( "%d", matrix.val[i] );


    free( matrix.val );

fclose( f );


return;
}

Можешь по......ться с утилитой специальной утилитой 

Автор: SoWa 2.1.2007, 08:35
Цитата(TwisT_X @  1.1.2007,  23:07 Найти цитируемый пост)
SoWa, а зачем писать вот это:or(i=length(s)+1) ?

Как зачем?! Иначе последний символ в строке выпускается.

Автор: TwisT_X 2.1.2007, 16:42
SoWa, я проверил как прога работает.. есть одно "но": последние число в строке и первое чилсо в следующей строке она считает как одно число.. Еще пока не придумал как рассоединить smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)