0 / 0 / 1
Регистрация: 12.03.2018
Сообщений: 331
1

Ошибка с считыванием информации из файла

26.05.2018, 16:59. Показов 1133. Ответов 4

Author24 — интернет-сервис помощи студентам
Program1.pas(98) : Ошибка времени выполнения: Входная строка имела неверный формат. - почему неверный формат?

Pascal
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
101
102
103
104
105
106
107
108
109
110
111
112
program lab6;
 
const nMax = 10;
 
type
  Workers = record
    Literary: String[50];
    Author: String[50];
    Year: integer;
    Category: String[10];
  end;
  tWorkers = array[1..nMax] of Workers;
 
var
  Lit: tWorkers;
  f: Text;
  fname: String[30];
  m, i: byte;
  cont: char;
  tmp: Workers;
 
procedure postYear(var wk: tWorkers; n: byte);
var post: integer;
begin
writeln('После какого года отобразить публикации?: ');
readln(post);
  writeln('Публикации после ', post, ' года'); 
  for var i: byte := 1 to n do 
  begin
    if wk[i].Year > post then 
      writeln(wk[i].Literary:15, wk[i].Author:50, wk[i].Year:15, wk[i].Category:10); 
  end;
end;
 
 
 
begin
 
 
  m := 1;
      writeln('Программа "Библиографический список" '); 
    writeln('1 - Создать новый файл'); 
    writeln('2 - Обработать существующий файл'); 
    writeln('3 - Завершить работу программы'); 
  
  while m <> 3 do
  begin
    
    readln(m);
    
    case m of
      1:
        begin
          write('Введите имя файла: ');
          readln(fname);
          writeln('Файл ', fname, ' создан');
          
          assign(f, fname); 
          rewrite(f);
          
          i := 1;
          
          cont := 'y';
          while cont = 'y' do 
            with tmp do
            begin
              writeln('Введите название  ', i,  '-литерат. источнка'); readln(Literary); 
              write('ФИО автора: ');      readln(Author);
              write('Год издания: ');   readln(Year); 
              write('Категория( книга или статья? ): ');   readln(Category); 
              writeln(f, Literary:15, Author:50, Year:15, Category:10); 
              Lit[ i ]:=tmp;
              i := i + 1;
              
              write('Клавиша y – продолжить ввод, другая  – прекратить ввод : ');
              readln(cont); 
              
              writeln();
              writeln();
              
              writeln('1 - Создать новый файл'); 
    writeln('2 - Посмотреть существующий файл'); 
    writeln('3 - Завершить работу программы'); 
            end;
          close(f);
        end;
      2:
        begin
          write('Введите имя файла '); 
          readln(fname); 
          assign(f, fname); 
          reset(f);
          i := 0; 
          while not eof(f) do
          begin
          i := i + 1; 
            with Lit[i] do
              readln(f, Literary, Author, Year, Category); 
          end; 
          close(f);
          for i := 1 to nMax do 
            with Lit[i] do 
              writeln(Literary:15, Author:50, Year:15, Category:10);
     writeln();
postYear(Lit, nMax);
        end;
    
    end;
    
  end;
 
end.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.05.2018, 16:59
Ответы с готовыми решениями:

Сформировать одномерный массив считыванием данных из файла, и найти максимальный и минимальный элемент массива
Помогите плиз! Сформировать одномерный массив считыванием данных из файла, и найти максимальный и...

Непонятки cо считыванием из файла.
Всё работает, не могу понять как сделать чтобы пользователь вводил имя файла. Компилятор уже еле...

Проблема со считыванием данных из файла
Здравствуйте, помогите пожалуйста. мне нужно считывать год мес. день с файла, но прога либо не...

Считыванием данных из файла в массив
На днях начал изучать Qt GUI, и столкнулся с проблемой, не могу считать матрицу с файла, может кто...

4
Эксперт Pascal/Delphi
6810 / 4567 / 4819
Регистрация: 05.06.2014
Сообщений: 22,438
26.05.2018, 19:03 2
Лучший ответ Сообщение было отмечено koks_ikkkk как решение

Решение

Потому что, вы записываете в текстовый файл одну строку, а считать пытаетесь 3+число;
Переделал на типизированный файл.

Pascal
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
101
102
103
program lab6;
 
const
  nMax = 10;
 
type
  Workers = record
    Literary: String[50];
    Author: String[50];
    Year: integer;
    Category: String[10];
  end;
  tWorkers = array[1..nMax] of Workers;
 
var
  Lit: tWorkers;
  f: file of Workers;
  fname: String[30];
  m, i: byte;
  cont: char;
  tmp: Workers;
 
procedure postYear(var wk: tWorkers; n: byte);
var
  post: integer;
begin
  writeln('После какого года отобразить публикации?: ');
  readln(post);
  writeln('Публикации после ', post, ' года'); 
  for var i: byte := 1 to n do 
  begin
    if wk[i].Year > post then 
      writeln(wk[i].Literary, wk[i].Author, wk[i].Year, wk[i].Category); 
  end;
end;
 
 
 
begin
  
  
  m := 1;
  writeln('Программа "Библиографический список" '); 
  writeln('1 - Создать новый файл'); 
  writeln('2 - Обработать существующий файл'); 
  writeln('3 - Завершить работу программы'); 
  
  while m <> 3 do
  begin
    readln(m);
    case m of
      1:
        begin
          write('Введите имя файла: ');
          readln(fname);
          writeln('Файл ', fname, ' создан');
          assign(f, fname); 
          rewrite(f);
          i := 1;
          cont := 'y';
          while cont = 'y' do 
            with tmp do
            begin
              writeln('Введите название  ', i, '-литерат. источнка');readln(Literary); 
              write('ФИО автора: ');readln(Author);
              write('Год издания: ');readln(Year); 
              write('Категория( книга или статья? ): ');
              readln(Category);
              write(f, tmp); 
              Lit[i ] := tmp;
              i := i + 1;
              write('Клавиша y – продолжить ввод, другая  – прекратить ввод : ');
              readln(cont); 
              writeln;
              writeln('1 - Создать новый файл'); 
              writeln('2 - Посмотреть существующий файл'); 
              writeln('3 - Завершить работу программы'); 
            end;
          close(f);
        end;
      2:
        begin
          write('Введите имя файла '); 
          readln(fname); 
          assign(f, fname); 
          reset(f);
          i := 0; 
          while not eof(f) do
          begin
            i := i + 1; 
            read(f, tmp);
            lit[i] := tmp;
          end; 
          close(f);
          for i := 1 to nMax do 
            with Lit[i] do 
              write(Literary, ' ', Author, ' ', Year, ' ', Category);
          writeln;
          postYear(Lit, nMax);
        end;
    end;
  end;
end.
1
0 / 0 / 1
Регистрация: 12.03.2018
Сообщений: 331
26.05.2018, 19:30  [ТС] 3
Объяснит, почему читает одну строку?
0
Почетный модератор
64299 / 47594 / 32743
Регистрация: 18.05.2008
Сообщений: 115,181
26.05.2018, 19:47 4
Лучший ответ Сообщение было отмечено ZX Spectrum-128 как решение

Решение

Цитата Сообщение от koks_ikkkk Посмотреть сообщение
writeln(f, Literary:15, Author:50, Year:15, Category:10);
Ввели в файл 1 строку из 4х слов разделенных пробелами

А прочитать пытаетесь считать поля записи
readln(f, Literary, Author, Year, Category);

Читать тогда нужно так
Pascal
1
2
3
4
5
6
7
8
9
readln(f,s);//прочитали строку из файла
while pos('  ',s)>0 do delete(s,pos('  ',s),1);//удалим лишние пробелы
Literary:=copy(s,1,pos(' ',s)-1);//получили первое поле
delete(s,1,pos(' ',s));//удалили начало строки
Author:=copy(s,1,pos(' ',s)-1);//получили второе поле
delete(s,1,pos(' ',s));//удалили начало строки
Year:=strtoint(copy(s,1,pos(' ',s)-1));//получили год
delete(s,1,pos(' ',s));//удалили начало строки
Category:=s;//остаток строки 4 поле
0
0 / 0 / 1
Регистрация: 12.03.2018
Сообщений: 331
26.05.2018, 21:15  [ТС] 5
Тогда не пойму, почему работает похожая программа? ( Тоже тип текстовый )

Pascal
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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
program lab6;
 
const nMax = 10;
 
type
  Workers = record
    Surname: String[20];
    Initials: String[5];
    Status: String[20];
    Year: integer;
    Salary: integer;
  end;
  tWorkers = array[1..nMax] of Workers;
 
var
  People: tWorkers;
  f: Text;
  fname: String[30];
  m, i: byte;
  cont: char;
  tmp: Workers;
 
procedure nowYear(var wk: tWorkers; n: byte);
begin
  writeln('Сотрудники, которые были приняты в 2018г. :'); 
  for var i: byte := 1 to n do 
  begin
    if wk[i].Year = 2018 then 
      writeln(wk[i].Surname:20, wk[i].Initials:5, wk[i].Status:20, wk[i].Salary:20); 
  end;
end;
 
 
 
begin
 
 
  m := 1;
      writeln('Программа "Список сотрудников предприятия" '); 
    writeln('1 - Создать новый файл'); 
    writeln('2 - Обработать существующий файл'); 
    writeln('3 - Завершить работу программы'); 
  
  while m <> 3 do
  begin
    
    readln(m);
    
    case m of
      1:
        begin
          write('Введите имя файла: ');
          readln(fname);
          writeln('Файл ', fname, ' создан');
          
          assign(f, fname); 
          rewrite(f);
          
          i := 1;
          
          cont := 'y';
          while cont = 'y' do 
            with tmp do
            begin
              writeln('Введите данные  ', i,  '-итого сотрудника'); 
              write('Фамилия: ');  readln(Surname); 
              write('Инициалы: ');      readln(Initials);
              write('Должность: ');      readln(Status); 
              write('Год приёма: ');   readln(Year); 
              write('Оклад: ');   readln(Salary); 
              writeln(f, Surname:20, Initials:5, Status:20, 
Year:20, Salary:20); 
              People[ i ]:=tmp;
              i := i + 1;
              
              write('Клавиша y – продолжить ввод, другая  – прекратить ввод : ');
              readln(cont); 
              
              writeln();
              writeln();
              
              writeln('1 - Создать новый файл'); 
    writeln('2 - Посмотреть существующий файл'); 
    writeln('3 - Завершить работу программы'); 
            end;
          close(f);
        end;
      2:
        begin
          write('Введите имя файла '); 
          readln(fname); 
          assign(f, fname); 
          reset(f);
          i := 0; 
          while not eof(f) do
          begin
          i := i + 1; 
            with People[i] do
              readln(f, Surname, Initials, Status, Year, Salary); 
          end; 
          
          close(f);
          for i := 1 to nMax do 
            with People[i] do 
              writeln(Surname:20, Initials:5, Status:20, 
     Year:20, Salary:20);
     writeln();
NowYear(People, nMax);
        end;
    
    end;
    
  end;
 
end.
Добавлено через 1 час 2 минуты
разобрался
0
26.05.2018, 21:15
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.05.2018, 21:15
Помогаю со студенческими работами здесь

Сложность со считыванием данных из файла в массив
Программа должна по нажатию кнопки считывать из файла числа и записывать их в массивы структуры....

Трабл с считыванием данных из бинарного файла
суть проблемы, программа отлично работает с данными после запуска, считывает и записывает на диск...

Проблема считыванием данных из файла (Fortran 90)
Доброго времени суток. Написал программку по считыванию данных из столбцов столбцов...

Ошибка со считыванием массива String
import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru