Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
San9I
1 / 1 / 1
Регистрация: 14.12.2014
Сообщений: 16
#1

Сохранение массива в файл, проверка целого числа и тд - Delphi

14.12.2014, 12:51. Просмотров 442. Ответов 9
Метки нет (Все метки)

Всем привет. Пишу курсовую работу, нужна ваша помощь. Уже не знаю что делать, есть несколько ошибок, надеюсь на вашу помощь, в решении таковых.

1. Сохранение массива из элемента StringGrid в файл .txt (с сохранением "формы" массива).

Т.е. в .txt файл должен выглядеть вот так:
Delphi
1
2
3
4
5
1 2 3
1 2 3
1 2 3
 
Определитель матрицы: 0
Но у меня конечный файл выглядит вот так:
Delphi
1
2
3
1 2 3 1 2 3 1 2 3
 
Определитель матрицы: 0
Помогите пожалуйста исправить. Вот код процедуры сохранения:
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procedure TForm1.SaveStringGrid(StringGrid: TStringGrid;
          const FileName: TFileName); // ïðîöåäóðГ* ñîõð. Г¬Г*òðèöû ГЁ îïðåäåëèòåëÿ
 var
   f:    TextFile;
   i, k: Integer;
 begin
  if SaveDialog1.Execute then      // âûáîð äèðåêòîðèè ñîõð. ГґГ*éëГ*
    AssignFile(f, savedialog1.FileName);
    Rewrite(f);
  with StringGrid do
  begin
   for k := 0 to RowCount - 1 do
     for i := 0 to ColCount - 1 do
       begin
       Write(F, Cells[i, k], ' ');
       end;
  end;
  Writeln(f);
  Writeln(f);
  Write(f, 'Îïðåäåëèòåëü Г¬Г*òðèöû: ' + Edit1.Text);
  CloseFile(F);
 end;
2. По заданию у меня массив должен состоять из целых чисел. Это реализованно посредством использования типа integer. Но если в файле есть вещественное число, выбивается ошибка "...raised exception class einouterror with message 'invalid numeric input'...". Как сделать так, чтобы, если было найдено вещественное число, или иной посторонний знак, появлялось сообщение ShowMessages с ошибкой. Вот код процедуры чтения из файла и заполнения StringGrid.

Delphi
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
procedure TForm1.LoadStringGrid(StringGrid: TStringGrid;
                                const FileName: TFileName);
label                                     // ìåòêè äëÿ goto
  start,
  finish;
var
  f:          TextFile;
  i, j, coll, n, m, g, btsel:  Integer;
  strTemp, s:    String;
begin
  start:
 
  if OpenDialog1.Execute then                // âûáîð äèðåêòîðèè õðГ*Г*ГҐГ*ГЁГї ГґГ*éëГ*
  begin
    AssignFile(f, openDialog1.FileName);   // Г·ГІГҐГ*ГЁГҐ ГґГ*éëГ*
    Reset(f);
  end
  else
  begin                             // åñëè ГґГ*éë Г*ГҐ âûáðГ*Г*, äèГ*ëîã ïðîäîëæГ*ГҐГІГ±Гї
    btsel:=MessageDlg('Г”Г*éë Г*ГҐ âûáðГ*Г*. '+
    'Ïîâòîðèòå ïîïûòêó',mtConfirmation, mbOKCancel,0);
 
    if (btsel=mrCancel) then        // îáðГ*áîòêГ* ГЄГ*îïêè Cancel
      goto finish
    else
      goto start;
  end;
 
  with StringGrid do                // Г*Г*Г·Г*ëî Г§Г*ïîëГ*ГҐГ*ГЁГї Г¬Г*Г±Г±ГЁГўГ*
  begin
    n:=0;
    g:=0;
    coll:=0;
 
    while not EOF (f) do           // ïîäñ÷åò ñòðîê
    begin
      readln(f,strTemp);
      n:=n+1;
    end;
 
    RowCount:= n;
    reset(f);
    readln(f,strTemp);
 
    while not EOLN (f) do             // ïîäñ÷åò ñòîëáöîâ
    begin
      read(f,m);
      g:=g+1;
    end;
 
    ColCount:=g;
    reset(f);
 
    if (n<>g) then                   // ïðîâåðêГ* Г*Г* ГІГ®, Г·ГІГ® Г¬Г*òðèöГ* ГЄГўГ*äðГ*ГІГ*Г*Гї
      begin;
        s:='ГЋГёГЁГЎГЄГ*. Êîëè÷åñòâî ñòðîê ГЁ ñòîëáöîâ Г*ГҐ îäèГ*Г*êîâî, ëèáî '+
        'ñîäåðæèìîå ГґГ*éëГ* Г*ГҐ èçâåñòГ*Г®.'+' ÏðîãðГ*ììГ* áóäåò Г§Г*âåðøåГ*Г*.';
        ShowMessage(s);
        Form1.Close;
      end
    else
 
    for j := 0 to RowCount - 1 do            // Г§Г*ïîëГ*ГҐГ*ГЁГҐ ýëåìåГ*òîâ StringGrid
 
      for i := 0 to ColCount - 1 do
      begin
        Read(f, m);
        Cells[i, j] := FloatToStr(m);
        Coll:=Coll+1;                   // ïîäñ÷åò êîëè÷åñòâГ* ýëåìåГ*òîâ Г¬Г*Г±Г±ГЁГўГ*
      end;
 
  end;
 
  CloseFile(f);
  Edit2.Text:=IntToStr(Coll);
  finish:
end;
P.S. Уважаемые гуру, не ругайтесь по поводу goto, в программировании я всего пару месяцев, надеюсь на вашу помощь.
0
Лучшие ответы (1)
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.12.2014, 12:51
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Сохранение массива в файл, проверка целого числа и тд (Delphi):

Рекурсивная функция целого типа, которая находит сумму цифр целого числа.
Пожалуйста ,помогите Написать рекурсивную функцию целого типа, которая находит...

Сохранение массива в файл
Подскажите, что не так в коде: type TKot=array of Integer; ...

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

Сохранение динамического массива в файл
Друзья! Что-то не так делаю, понять не могу что, помогите.. В программе моей...

Сохранение и загрузка Массива, stringgrid в файл + Переменную
Matrix :array of integer; сохранение в текстовый файл. Stringgrid и массив...

В зависимости от значения целого числа К просклонять фразу: "К файл (файла, файлов)".
господа! киньте плиз функцию, штоб писало скока файлов, тобишь интерисуют...

9
FIL
Модератор
3409 / 2547 / 725
Регистрация: 19.09.2012
Сообщений: 7,908
14.12.2014, 13:06 #2
Могу предложить такой вариант:
http://www.cyberforum.ru/delphi-begi...ml#post6971045
0
Puporev
Модератор
54136 / 41769 / 28880
Регистрация: 18.05.2008
Сообщений: 98,312
14.12.2014, 13:13 #3
Лучший ответ Сообщение было отмечено San9I как решение

Решение

Цитата Сообщение от San9I Посмотреть сообщение
Сохранение массива из элемента StringGrid в файл .txt
Ну если есть массив, то и сохраняй его, при чем тут таблица?
Но уж если приспичило, то пиши так
Delphi
1
2
3
4
5
6
7
8
9
with StringGrid do
  begin
   for k := 0 to RowCount - 1 do
    begin
      for i := 0 to ColCount - 1 do
      Write(F, Cells[i, k], ' ');
      Writeln(F);//новая строка в файле
     end;
  end;
1
San9I
1 / 1 / 1
Регистрация: 14.12.2014
Сообщений: 16
14.12.2014, 15:16  [ТС] #4
Спасибо, все что требовалось, это лишь эту строчку дописать. Я писал ее раньше, но что то не работала. В форме таблицы надо сохранять, т.к этого требует техническое задание.

Теперь бы еще хотелось увидеть ответ на второй вопрос.
0
Puporev
Модератор
54136 / 41769 / 28880
Регистрация: 18.05.2008
Сообщений: 98,312
14.12.2014, 15:26 #5
Цитата Сообщение от San9I Посмотреть сообщение
Теперь бы еще хотелось увидеть ответ на второй вопрос.
При чтении строк для подсчета их количества проверяйте в них наличие символов, отличных от цифр, пробелов и знаков табуляции. Если такие символы есть, выводите сообщение о неверных данных в файле и аварийно выходите из процедуры или из программы.
0
San9I
1 / 1 / 1
Регистрация: 14.12.2014
Сообщений: 16
14.12.2014, 15:30  [ТС] #6
В том то и дело, что я пишу функцию для поиска символов, отличных от цифр тут, во время подсчета столбцов (первое чтение символов, подсчет столбцов).
Delphi
1
2
3
4
5
    while not EOLN (f) do             // подсчет столбцов
    begin
      read(f,m);
      g:=g+1;
    end;
Но все равно ошибка вылезает. Может я не тут пишу, и не то был бы благодарен, если бы вы помогли, что, куда и к чему)
0
Puporev
Модератор
54136 / 41769 / 28880
Регистрация: 18.05.2008
Сообщений: 98,312
14.12.2014, 15:31 #7
Цитата Сообщение от San9I Посмотреть сообщение
во время подсчета столбцов
Я пишу
Цитата Сообщение от Puporev Посмотреть сообщение
При чтении строк для подсчета их количества
0
San9I
1 / 1 / 1
Регистрация: 14.12.2014
Сообщений: 16
14.12.2014, 15:34  [ТС] #8
Сейчас попробую, отпишусь.
0
Puporev
Модератор
54136 / 41769 / 28880
Регистрация: 18.05.2008
Сообщений: 98,312
14.12.2014, 15:35 #9
Delphi
1
2
3
4
5
6
7
8
9
10
11
while not EOF (f) do           // подсчет строк
 begin
  readln(f,strTemp);
  k:=0;
  i:=1;
  while(i<=length(strTemp))and(k=0) do
  if not(strTemp[i] in ['0'..'9',#32,#7]) then k:=1
  else inc(i);
  if k=1 then сообщение и выход
  else n:=n+1;
 end;
0
San9I
1 / 1 / 1
Регистрация: 14.12.2014
Сообщений: 16
14.12.2014, 15:41  [ТС] #10
Все, большое спасибо, темку можно закрывать.
0
14.12.2014, 15:41
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2014, 15:41
Привет! Вот еще темы с решениями:

Дан массив размера 5 x 6 с элементами целого типа. Написать программу для вычисления числа элементов массива кратных 3
procedure TForm1.Button1Click(Sender: TObject); var i,j: byte; sum:...

Сохранение/чтение в нетипизированный файл массива используя потоки
Здравствуйте, необходима помощь, так как не понимаю использования потоков,...

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

Вывести на экран монитора цифру к-того разряда целого числа. Разряды числа пронумерованы справа налево, начиная с единицы
Выручайте пожалуйста :( 1.Вывести на экран монитора цифру к-того разряда...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru