Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
BlitZz
1 / 1 / 0
Регистрация: 13.03.2009
Сообщений: 40
#1

Работа с файлами[открытие двумерного масива] - C++

19.05.2009, 19:35. Просмотров 1136. Ответов 19
Метки нет (Все метки)

Здравствуйте.
Есть задачка: найти определитель матрицы NxN,
+ одно из условий запись матрицы в файл, а потом его открытие и решение детерминанта.
Определитель работает отлично, функция записи в файл тоже работает отлично, но вот проблема в функции открытия файла так, что бы я потом мог посчитать детерминант.
Тоесть мне нужно (как я понимаю) открывать матрицу и считывать ее посимвольно, но это у меня не выходит сделать =(
C++
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
//Функция сохранения  файла
void savex (double** a, int na, int ma)
{int i, j;
 
printf("\nВведите имя файла\n");
 
 scanf(" %s",fname);
 
 if ((in=fopen(fname, "wt"))==NULL)
  {
   printf ("\nОшибка открытия файла для записи!");
   getch();
   return;
  }
 
  //fprintf(in, "\n");
fprintf (in,"Матрица A:\n");
 
   for (i=0; i<na; i++)
    {
     for (j=0; j<ma; j++)
      fprintf (in, "%.2f\t", a[i][j]);
      fprintf (in,"\n");
    }
 
   fclose(in);
  printf("\nМатрица успешно сохранена в файл %s", fname);
 getch();
}
 
 
//функция открытия файла
void openx(double **a,int na, int ma)
     { fflush(stdin);
       int i, j;
       double at;
       printf("\nВведите имя файла\n");
       scanf("%s",fname);
       if ((in=fopen(fname, "rt"))==NULL)
    {
     printf ("\nОшибка открытия файла для чтения %s\n", fname);
     getch();
     return;
    }
       clrscr();
    while (!feof(in))
     {
 
//ВОТ здесь и начинаються все проблемы
 
      fscanf(in,"%f",&na);
       fscanf(in,"%f",&ma);
    fscanf(in,"\n");
      fgets(st,MAXLEN,in);
      printf("%s",st);
 
       a=(double**) calloc (na,sizeof(double*));
       for (i=0; i<na; i++)
       a[i]=(double*) calloc (ma,sizeof(double));
       for (i=0; i<na; i++)
    {for (j=0; j<ma; j++)
      {
       fscanf(in,"%lf\n", &at);
 
      a[i][j]=at;
      }}
 
 
       for (i=0; i<na; i++)
    {
     for (j=0; j<ma; j++)
      printf ("%.2lf\t",a[i][j]);
 }}
Сохраненная матрица выглядит так:
Код
Матрица А:
9.00     8.00    4.00
5.00     32.00   3.00
56.00    41.00   9.00
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.05.2009, 19:35     Работа с файлами[открытие двумерного масива]
Посмотрите здесь:

C++ Работа с файлами
Работа с файлами C++
C++ Работа с файлами
Посчитать сумму четных элементов двумерного масива C++
присвоить стрке двумерного масива значение C++
C++ min, max двумерного масива
C++ Работа с файлами
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Evg
Эксперт CАвтор FAQ
17259 / 5513 / 342
Регистрация: 30.03.2009
Сообщений: 15,010
Записей в блоге: 26
19.05.2009, 20:02     Работа с файлами[открытие двумерного масива] #2
Запись и чтение у тебя несимметричные. При записи ты скидываешь только матрицу, а при чтении сначала пытаешься прочесть размерность. Сами элементы записываешь через "%f", а считываешь через "%lf"
BlitZz
1 / 1 / 0
Регистрация: 13.03.2009
Сообщений: 40
19.05.2009, 21:12  [ТС]     Работа с файлами[открытие двумерного масива] #3
Флоаты я исправил, но вот как сделать запись и чтение симметричными не могу понять =(
Evg
Эксперт CАвтор FAQ
17259 / 5513 / 342
Регистрация: 30.03.2009
Сообщений: 15,010
Записей в блоге: 26
19.05.2009, 21:17     Работа с файлами[открытие двумерного масива] #4
Цитата Сообщение от BlitZz Посмотреть сообщение
Флоаты я исправил, но вот как сделать запись и чтение симметричными не могу понять =(
Либо записывать размерность массива. Либо её не считывать
BlitZz
1 / 1 / 0
Регистрация: 13.03.2009
Сообщений: 40
19.05.2009, 21:26  [ТС]     Работа с файлами[открытие двумерного масива] #5
Тоесть
fscanf(in,"%f",&na);
fscanf(in,"%f",&ma);
записывать не стоит?
Evg
Эксперт CАвтор FAQ
17259 / 5513 / 342
Регистрация: 30.03.2009
Сообщений: 15,010
Записей в блоге: 26
19.05.2009, 21:29     Работа с файлами[открытие двумерного масива] #6
Если у тебя матрице железно 3 на 3, то при чтении матрицы из файла вместо этих fscanf'ов просто пиши na=3; ma=3; Если матрица произвольного размера, то в savex нужно ещё и размеры записать. Просто я не знаю, как ещё объяснить, что запись и чтение должны быть симметричными

Кстати, я не знаю, как fscanf'ы реагируют на пробелы и переводы строки. Возможно, что ещё и с этим проблемы будут
BlitZz
1 / 1 / 0
Регистрация: 13.03.2009
Сообщений: 40
19.05.2009, 21:37  [ТС]     Работа с файлами[открытие двумерного масива] #7
Цитата Сообщение от Evg Посмотреть сообщение
Если у тебя матрице железно 3 на 3, то при чтении матрицы из файла вместо этих fscanf'ов просто пиши na=3; ma=3; Если матрица произвольного размера, то в savex нужно ещё и размеры записать. Просто я не знаю, как ещё объяснить, что запись и чтение должны быть симметричными

Кстати, я не знаю, как fscanf'ы реагируют на пробелы и переводы строки. Возможно, что ещё и с этим проблемы будут
В том то вся и беда что матрица размера NxN
спс за ответ щас тогда с размерами помучаюсь
Evg
Эксперт CАвтор FAQ
17259 / 5513 / 342
Регистрация: 30.03.2009
Сообщений: 15,010
Записей в блоге: 26
19.05.2009, 21:39     Работа с файлами[открытие двумерного масива] #8
После каждого fscanf'а делай printf. Типа

C
1
2
fscanf(in,"%f",&na);
printf ("na=%d\n", na);
Так ты будешь "видеть" процесс чтения из файла.
Кстати, размерность матрицы - целое число, а потому и читать и писать вместо %f надо %d
BlitZz
1 / 1 / 0
Регистрация: 13.03.2009
Сообщений: 40
20.05.2009, 00:21  [ТС]     Работа с файлами[открытие двумерного масива] #9
Цитата Сообщение от Evg Посмотреть сообщение
После каждого fscanf'а делай printf. Типа

C
1
2
fscanf(in,"%f",&na);
printf ("na=%d\n", na);
Так ты будешь "видеть" процесс чтения из файла.
Кстати, размерность матрицы - целое число, а потому и читать и писать вместо %f надо %d
О, кстати да насчет %d то действительное число у меня стояло изначально, но тогда в первом столбце матрицы пропадал первый символ тоесть столбец выглядел так:

.00 8.00 4.00
изменивши на флоат стало нормально показывать

Добавлено через 2 часа 38 минут 11 секунд
Немного подкорректировал код:
C++
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
void zagruz(double **a,int na, int ma)
     { fflush(stdin);
       int i, j;
       double at;
       printf("\nВведите имя файла");
       printf("\nHапример: '\matrix.txt'");
       printf("\n");
       scanf("%s",fname);
       if ((in=fopen(fname, "rt"))==NULL)
    {
     printf ("\nОшибка открытия файла для чтения %s\n", fname);
     getch();
     return;
    }
       clrscr();
    while (!feof(in))
     {   fscanf(in,"%d",&na);
      printf("na=%d\n",na);
      fscanf(in,"%d",&ma);
      printf("ma=%d\n",ma);
    fscanf(in,"\n");
 
       {
 
 
      fgets(st,MAXLEN,in);
      printf("%s",st);
 
 
       a=(double**) calloc (na,sizeof(double*));
       for (i=0; i<na; i++)
       a[i]=(double*) calloc (ma,sizeof(double));
       for (i=0; i<na; i++)
    {for (j=0; j<ma; j++)
      {
       fscanf(in,"%f\n\0", &at);
 
      a[i][j]=at;
      }}
 
 
       for (i=0; i<na; i++)
    {
     for (j=0; j<ma; j++)
      printf ("%.2f\t",a[i][j]);
 
 
     }      }
 
       free(a[i]);free(a);
 
     }
       fclose(in);
 
      }
после компиляции выдает вот такой результат:
na=3
ma=-28921
.00 4.00
na=5
ma=-28921
.00 4.00
na=5
ma=-28921
.00 4.00
А изначально матрица которая должна отобразиться выглядит вот так:
3.00 4.00
5.00 4.00
вывод: отображает бред:
1) не выводит первый символ каждого рядка
2)Выводит еще одну лишнюю строчку
короче что-то я вообще не догоняю что оно выводит(
Evg
Эксперт CАвтор FAQ
17259 / 5513 / 342
Регистрация: 30.03.2009
Сообщений: 15,010
Записей в блоге: 26
20.05.2009, 12:20     Работа с файлами[открытие двумерного масива] #10
> А изначально матрица которая должна отобразиться выглядит вот так:

Дык ты покажи, что ты в файл записал, а не то, какая у тебя матрица. И код процедуры, которая в файл записывает
BlitZz
1 / 1 / 0
Регистрация: 13.03.2009
Сообщений: 40
20.05.2009, 18:03  [ТС]     Работа с файлами[открытие двумерного масива] #11
Разобрался с лишней строкой:
В функции сохранения файла, при последнем вводе ставиться табуляция,
и переход на следующую строку, а следовательно и при считывании выводит лишнюю строку =( как изменить не знаю
что бы при последнем символе завершало запись
C++
1
2
3
 
fprintf (in, "%.2f\t", a[i][j]);
fprintf (in,"\n");
код функции которая в файл записывает описана в первом посте
Evg
Эксперт CАвтор FAQ
17259 / 5513 / 342
Регистрация: 30.03.2009
Сообщений: 15,010
Записей в блоге: 26
20.05.2009, 19:38     Работа с файлами[открытие двумерного масива] #12
Мало что понял в предыдущем посте, но просто лепи всё через пробел и не заморачивайся. А если хочется крастоы, то надо аккуратно писать парсер, который циферки будет вырезать, а пробелы, энтеры и табуляции игнорировать
BlitZz
1 / 1 / 0
Регистрация: 13.03.2009
Сообщений: 40
20.05.2009, 20:54  [ТС]     Работа с файлами[открытие двумерного масива] #13
Да дело в том, что мне эту матрицу нужно открыть для того что бы посчитать ее детерминант, поэтому просто в строчку выводить нельзя.
А через парсер сомневаюсь что в моих силах такое сделать =(
Может есть какие то другие варианты?
Evg
Эксперт CАвтор FAQ
17259 / 5513 / 342
Регистрация: 30.03.2009
Сообщений: 15,010
Записей в блоге: 26
20.05.2009, 21:35     Работа с файлами[открытие двумерного масива] #14
а в чём проблема загонять в строку? У тебя же программа будет записывать, программа и считывать
Или файл кто-то будет ручками формировать?
BlitZz
1 / 1 / 0
Регистрация: 13.03.2009
Сообщений: 40
20.05.2009, 21:53  [ТС]     Работа с файлами[открытие двумерного масива] #15
Ну так проблема в том, что программа не будет понимать что это матрица, а просто напечатет мне строку, не так ли?
Evg
Эксперт CАвтор FAQ
17259 / 5513 / 342
Регистрация: 30.03.2009
Сообщений: 15,010
Записей в блоге: 26
20.05.2009, 22:40     Работа с файлами[открытие двумерного масива] #16
То, что напечатает на экране и то, что запишется в файл - две разные вещи. В файле ты просто запоминаешь набор цифр. Потом трактуешь его как матрицу и делаешь с ней что хочешь. Я просто твоих проблем понять не могу
BlitZz
1 / 1 / 0
Регистрация: 13.03.2009
Сообщений: 40
20.05.2009, 22:46  [ТС]     Работа с файлами[открытие двумерного масива] #17
Моя проблема в том что мне нужно из файла прочитать матрицу и вкинуть ее в программу что бы посчитать детерминант, но это сделать правильно у меня не выходит
Evg
Эксперт CАвтор FAQ
17259 / 5513 / 342
Регистрация: 30.03.2009
Сообщений: 15,010
Записей в блоге: 26
20.05.2009, 23:26     Работа с файлами[открытие двумерного масива] #18
А файл откуда берётся? Его кто-то руками создаёт или программа записывает? Я уже несколько раз тебя об этом спрашиваю, ты никак внятно не ответишь. Почему всё из тебя клещами тянуть надо?

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

Код
3 3
1.00 2.00 3.00
4.00 5.00 6.00
7.00 8.00 9.00
Вот здесь в аттаче набор процедур для построкового чтения из файла Потеря символа при копировании строки

Процесс чтения такой. Читаем строку из файла. Потом из этой строки выковыриваем размерность матрицы (количество колонок и столбиков).
Далее в цикле читаем по одной строке текста из файла и на одну строку файла делаем ещё один цикл по выковыриванию чисел из считанной строки. Получается что-то типа того

Код
Прочитали первую строку из файла. Выковыряли из неё na и ma

a=(double**) calloc (na,sizeof(double*));
for (i=0; i<na; i++)
{
  a[i]=(double*) calloc (ma,sizeof(double));
  Прочитали строку из файла в строковой буффер
  for (j=0; j<ma; j++)
  {
    Выковыряли очередное число из буффера и записали его в a[i][j]
  }
}
У меня плохо с математикой, но если детерминант считается только для квадратной матрицы, то в первой строке тебе нужно записывать одно число, а не два
BlitZz
1 / 1 / 0
Регистрация: 13.03.2009
Сообщений: 40
21.05.2009, 21:59  [ТС]     Работа с файлами[открытие двумерного масива] #19
А не подскажете как это же реализовать но с помощью new delete?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.05.2009, 23:18     Работа с файлами[открытие двумерного масива]
Еще ссылки по теме:

Работа со строками двумерного массива C++
C++ Работа с файлами C++
C++ Работа с файлами
Сравнение двумерного масива C++
Работа с файлами на С++ C++

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

Или воспользуйтесь поиском по форуму:
Evg
Эксперт CАвтор FAQ
17259 / 5513 / 342
Регистрация: 30.03.2009
Сообщений: 15,010
Записей в блоге: 26
21.05.2009, 23:18     Работа с файлами[открытие двумерного масива] #20
Цитата Сообщение от BlitZz Посмотреть сообщение
А не подскажете как это же реализовать но с помощью new delete?
Двумерный динамический массив - найти ошибку в коде
Yandex
Объявления
21.05.2009, 23:18     Работа с файлами[открытие двумерного масива]
Ответ Создать тему
Опции темы

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