Форум программистов, компьютерный форум, киберфорум
Наши страницы

Delphi для начинающих

Войти
Регистрация
Восстановить пароль
 
San9I
1 / 1 / 0
Регистрация: 14.12.2014
Сообщений: 16
#1

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

14.12.2014, 12:51. Просмотров 412. Ответов 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):

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

Сохранение массива в файл - Delphi
Подскажите, что не так в коде: type TKot=array of Integer; SaveKot=Record end; var SaveF:File of Integer;

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

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

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

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

9
FIL
Модератор
3375 / 2513 / 478
Регистрация: 19.09.2012
Сообщений: 7,845
14.12.2014, 13:06 #2
Могу предложить такой вариант:
Сохранить таблицу в файл
0
Puporev
Модератор
52370 / 40217 / 13559
Регистрация: 18.05.2008
Сообщений: 92,942
14.12.2014, 13:13 #3
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от 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 / 0
Регистрация: 14.12.2014
Сообщений: 16
14.12.2014, 15:16  [ТС] #4
Спасибо, все что требовалось, это лишь эту строчку дописать. Я писал ее раньше, но что то не работала. В форме таблицы надо сохранять, т.к этого требует техническое задание.

Теперь бы еще хотелось увидеть ответ на второй вопрос.
0
Puporev
Модератор
52370 / 40217 / 13559
Регистрация: 18.05.2008
Сообщений: 92,942
14.12.2014, 15:26 #5
Цитата Сообщение от San9I Посмотреть сообщение
Теперь бы еще хотелось увидеть ответ на второй вопрос.
При чтении строк для подсчета их количества проверяйте в них наличие символов, отличных от цифр, пробелов и знаков табуляции. Если такие символы есть, выводите сообщение о неверных данных в файле и аварийно выходите из процедуры или из программы.
0
San9I
1 / 1 / 0
Регистрация: 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
Модератор
52370 / 40217 / 13559
Регистрация: 18.05.2008
Сообщений: 92,942
14.12.2014, 15:31 #7
Цитата Сообщение от San9I Посмотреть сообщение
во время подсчета столбцов
Я пишу
Цитата Сообщение от Puporev Посмотреть сообщение
При чтении строк для подсчета их количества
0
San9I
1 / 1 / 0
Регистрация: 14.12.2014
Сообщений: 16
14.12.2014, 15:34  [ТС] #8
Сейчас попробую, отпишусь.
0
Puporev
Модератор
52370 / 40217 / 13559
Регистрация: 18.05.2008
Сообщений: 92,942
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 / 0
Регистрация: 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
Привет! Вот еще темы с ответами:

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

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

Проверка ввода целого числа - C++
Помогите разобраться, плиз... есть код: #include &lt;iostream&gt; using std::endl; using std::cout; using std::cin; void...

Множества, проверка вхождения целого числа - Pascal
Даны числа а1, а2, ... , аn(могут повторяться). Вывести на печать все которые входят в последовательность по одному разу.


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

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

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