Чтение из файла

Тема в разделе "WASM.BEGINNERS", создана пользователем Application, 16 фев 2023.

  1. Application

    Application Active Member

    Публикаций:
    1
    Регистрация:
    15 окт 2022
    Сообщения:
    110
    Доброго времени суток! При переводе исходника си/си ++ на ламповый pascal возникла такая проблема:
    Код (Text):
    1.  
    2. void ShowMessage(char *s)
    3. {
    4.     MessageBox(0, s, "", 0);
    5. }
    6.  
    7. //
    8.  
    9. long long words, size;
    10.  
    11. f = fopen('test.txt', "rb");
    12.  
    13.   if (f == NULL)
    14.   {
    15.     return -1;
    16.   }
    17.  
    18.   fscanf(f, "%lld", &words);
    19.   fscanf(f, "%lld", &size);
    20.  
    21.   //printf("%lld  %lld", words, size); выдает то же самое
    22.  
    23.   wsprintfA(str, "words: %d", words);
    24.  
    25.   ShowMessage(str);
    26.  
    27.   wsprintfA(str, "size: %d", size);
    28.  
    29.   ShowMessage(str);
    30.  
    31.  
    Выдает значения 163, 200.

    Код (Text):
    1.  
    2. var
    3.     hFile: dword;
    4.     words, size: LongInt;
    5. begin
    6.  
    7.  hFile := FileOpen('test.txt', fmOpenRead);
    8.  
    9.   if (hFile = -1) then Exit;
    10.  
    11.   FileSeek(hFile, 0, 0);
    12.  
    13.   FileRead(hFile, words, SizeOf(words));
    14.   ShowMessage(IntToStr(words));
    15.  
    16.   FileRead(hFile, size, SizeOf(size));
    17.   ShowMessage(IntToStr(size));
    18.  
    19.   FileClose(hFile);
    20.  
    Выдает значения 540227121, 170930226.

    Файл один и тот же.

    Что я делаю не так?

    Пробывал менять тип переменных, во втором исходнике:

    words, size: LongInt;
    //words, size: word;
    //words, size: Int64;

    Код (Text):
    1.   fscanf(f, "%lld", &words);
    2.   fscanf(f, "%lld", &size);
    Скорее всего все дело в этой части. Как сделать, чтобы в обоих случаях работало одинаково? =/
     
    Последнее редактирование: 16 фев 2023
  2. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.250
    Эмм, ну так fscanf читает инт из строки, а FileRead очевидно читает байты, не знаю, как в этом вашем Паскале это делается, но тебе нужно считать файл, как строку, потом оттуда достать две строки с числами (разбить по пробелам, или что там), потом преобразовывать каждую из них в инты, или что там тебе надо с ними делать).
     
    Application нравится это.
  3. aa_dav

    aa_dav Active Member

    Публикаций:
    0
    Регистрация:
    24 дек 2008
    Сообщения:
    441
    На ламповом паскале аналоги scanf/printf это Read/Write и сопутствующие файловые функции:
    Код (Text):
    1. Program Example50;
    2.  
    3. { Program to demonstrate the Read(Ln) function. }
    4.  
    5. Var S : String;
    6.     C : Char;
    7.     F : File of char;
    8.  
    9. begin
    10.   Assign (F,'ex50.pp');
    11.   Reset (F);
    12.   C:='A';
    13.   Writeln ('The characters before the first space in ex50.pp are : ');
    14.   While not Eof(f) and (C<>' ') do
    15.     Begin
    16.     Read (F,C);
    17.     Write (C);
    18.     end;
    19. Writeln;
    20. Close (F);
    21. Writeln ('Type some words. An empty line ends the program.');
    22. repeat
    23.    Readln (S);
    24. until S='';
    25. end.
     
    Application нравится это.
  4. Application

    Application Active Member

    Публикаций:
    1
    Регистрация:
    15 окт 2022
    Сообщения:
    110
    Спасибо, получилось!

    Код (Text):
    1.  
    2.   f: file of char;
    3.   ...
    4.   Assign(F, 'test.txt');
    5.   Reset(F);
    6.  
    7.   s1 := '';
    8.   token_counter := 0;
    9.  
    10.   while not Eof(f) do
    11.   begin
    12.     Read (F, c_buf);
    13.     if (c_buf = ' ') or (c_buf = #10) then
    14.     begin
    15.       if token_counter = 0 then
    16.       begin
    17.         ShowMessage(s1);
    18.       end;
    19.    
    20.       if token_counter = 1 then
    21.       begin
    22.         ShowMessage(s1);
    23.       end;
    24.    
    25.       token_counter := token_counter + 1;
    26.       if token_counter >= 2 then Break;
    27.    
    28.       s1 := '';
    29.     end
    30.     else
    31.     begin
    32.       s1 := s1 + c_buf;
    33.     end;
    34.   end;
     
    Последнее редактирование: 16 фев 2023