Чтение файла в матрицу
Ниже показан пример считывания текстового файла в матрицу с типом элементов char, а в файле качестве разграничителя строк используется признак конца строки ( ‘\n’ ). Этот разграничитель используется по умолчанию Поскольку количество строк в текстовых файлах заранее обычно не
известно, то при вводе требуется организовать счетчик количества введенных строк. В примере в качестве такого счетчика использована переменная count.
string textline; // Для такого объявления вставить #include <string> char matr[ROW][COL];
int count = -1; // -1, поскольку сначала наращивание номера //строки, а затем запись по этому номеру, и 1-я //сторока имеет индекс 0
// Оператор цикла для чтения до конца файла записывают так: while (!inFil.eof())
// Но этот же цикл можно оформить и так while (getline(inFil, textline)
// Функция c_str() приписывает к строке символ конца строки strcpy (matr[count],textline.c_str());
Примечание: Когда в процессе записи кода программы после переменной textline записывают точку, то появляется список доступных элементов для этого класса ( textline — это переменная класса string ). Если такой список не появился, то возможно произошла ошибка при объявлении переменной. Иногда список не появляется из-за ошибки среды Visual С++. В последнем случае надо закрыть приложение, в папке приложения исключить файл с расшире-
нием .ncb . При последующем входе в среду разработки этот файл будет восстановлен.
Чтение файла в структуру
Обычно структура содержит данные описывающие некоторый объект, например, автомобиль, студента, товар и т. д. Особенностью такого описания является наличие разнотипных данных (текста, чисел, дат). Данные о таких объектах хранятся в файлах.
Когда файл содержит разнотипные данные, включая строки текста, содержащие пробелы, то становится проблематичным отделение данных относящихся к одному параметру, от данных являющимися другим полем.
Решение этой проблемы может быть либо в задании в файле постоянной длины полей для каждого элемента данных структуры, либо в использовании разграничителей.
Ниже приведен пример чтения из файла экземпляров глоссария в массив структур с использованием разграничителей. Каждый экземпляр глоссария состоит из ключевого слова (или фразы) и объяснения этого ключевого слова. Например, ключевое слово «Белый пробел», объяснение «Это клавиши ENTER, TAB и клавиша пробела, которые разделяют элементы при вводе с клавиатуры или из файла».
Обычно ключевое слово состоит из одной строки (в которую могут входить слова, разделенные пробелами), а объяснение может содержать произвольное количество строк. По этой причине желательно в каждом экземпляре глоссария сохранять количество строк объяснения (см. объявление в тексте прогораммы ниже).
В файле все элементы глоссария расположены последовательно, но количество строк объяснения переменное, поэтому требуется способ для отделения одного экземпляра глоссария от другого, а ключевого слова от объяснения. Это можно сделать, например, с помощью разграничителей, в качестве которых можно использовать символы, не применяющиеся для описания глоссария. Так в русском языке редко применяются символы: @, #, $, &, €, ¥ и т. д.
Выберем в качестве разграничителя экземпляров глоссария, например, символ ‘@’ , а для отделения ключевого слова от объяснения символ ‘# ’.
Полная программа считывания глоссария в массив структур и вывод этого массива на экран приведена ниже.
#include «stdafx.h» #include <string> #include «conio.h» #include <iostream> #include <fstream> using namespace std;
#define FNAME «Text.txt» // Файл размещен в папке проекта
#define SIZELST 100 #define SIZET 50 #define SIZEXP 20 #define COL 80 struct gloss
Действия над считанными из файла матрицами
Разработать программу для обработки матриц. Программа должна выполнять следующие действия: суммы, вычитания, умножения двух матриц. Матрицы должны храниться в двух разных файлах. То есть, при запуске программы, необходимо считать из файлов две матрицы и уже после этого производить вычисления. Результат вывести на экран.
К сожалению, решения данной задачи пока нет. Если Вы решили эту задачу, сообщите нам, и мы выложим её на сайте.
Комментарии
RaldenProg
Дима Дорошенко
Дима Дорошенко
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
void Sum(int *m1, int *m2, int m, int n, int c, int d)
<
if(m != c)
<
cout << «Error. » << endl;
return;
>
if(n != d)
<
cout << «Error. » << endl;
return;
>
int *result = new int[100];
for(int i = 0; i < (m * n); i++)
result[i] = m1[i] + m2[i];
void Dif(int *m1, int *m2, int m, int n, int c, int d)
<
if(m != c)
<
cout << «Error. » << endl;
return;
>
if(n != d)
<
cout << «Error. » << endl;
return;
>
int *result = new int[100];
for(int i = 0; i < (m * n); i++)
result[i] = m1[i] — m2[i];
void Multi(int *m1, int *m2, int m, int n, int c, int d)
<
if(n != c)
<
cout << «Error. » << endl;
return;
>
int e = m, f = d; // разрешение новой матрицы
int a = 0;
int **mas1 = new int*[m];
for(int i = 0; i < m; i++)
mas1[i] = new int[n];
for(int i = 0; i < m; i++)
for(int j = 0; j < n; j++)
mas1[i][j] = m1[a++];
a = 0;
int **mas2 = new int*[c];
for(int i = 0; i < c; i++)
mas2[i] = new int[d];
for(int i = 0; i < c; i++)
for(int j = 0; j < d; j++)
mas2[i][j] = m2[a++];
int **result = new int*[e];
for(int i = 0; i < e; i++)
result[i] = new int[f];
for(int i = 0; i < e; i++)
<
for(int j = 0; j < f; j++)
<
result[i][j] = 0;
for(int k = 0; k < n; k++)
<
int temp = mas1[i][k] * mas2[k][j];
result[i][j] += temp;
>
>
>
void Parser(string str)
<
string name1;
string name2;
int i = 0;
while(str[i] == ‘ ‘)
i++;
ifstream matrix(name1);
if(!matrix.is_open())
<
cout << «Error. File » << name1 << » not exist. » << endl;
while(!matrix.is_open())
<
matrix.close();
name1.clear();
cout << «Please repeat: «;
getline(cin, name1);
matrix.open(name1);
>
>
name1.clear();
char k;
while(!matrix.eof())
<
if(matrix.get(k))
name1 += k;
>
cout << «Matrix 1:» << endl << name1 << endl << endl;
matrix.open(name2);
if(!matrix.is_open())
<
cout << «Error. File » << name2 << » not exist. » << endl;
while(!matrix.is_open())
<
matrix.close();
name2.clear();
cout << «Please repeat: «;
getline(cin, name2);
matrix.open(name2);
>
>
name2.clear();
int m = 1, n = 1; // размерность первой матрицы
int c = 1, d = 1; // размерность второй матрицы
Dim(name1, m, n); // подсчет размерности
Dim(name2, c, d);
cout << m << ‘
int *m1 = new int[100];
int *m2 = new int[100];
Convert_to_int(name1, m1, m, n);
Convert_to_int(name2, m2, c, d);
// теперь в массивах записаны матрицы
int f = str.find(‘+’);
if(f > 0)
<
Sum(m1,m2,m,n,c,d);
return;
>
f = str.find(‘-‘);
if(f > 0)
<
Dif(m1,m2,m,n,c,d);
return;
>
f = str.find(‘*’);
if(f > 0)
<
Multi(m1,m2,m,n,c,d);
return;
>
>
int main()
<
while(1)
<
system(«cls»);
string Str;
//char Operation;
cout << «Enter the matrix (Example: name1.txt + name2.txt): «;
getline(cin, Str);
Parser(Str);
system(«pause»);
>
Как считать матрицу из файла си
| matrix.txt (280 байт, 130 просмотров) |

- Вначале обходим весь файл и считыванием через поток все целые числа. Тем самым узнаем число чисел в матрице.
- Затем посчитаем число пробелов до первого знака перевода на новую строку. Значит, число столбцов будет равно числу пробелов +1.
- Теперь мы знаем размеры матрицы и можем создать массив, и пройти по файлу, считывая данные в матрицу.
- Можно сократить обход файла до одного, если, например, использовать списки.
- Считается, что между числами есть один пробел, а в конце строки пробела нет. А если будут лишние пробелы?
- Предполагаем, что в других строчках число чисел такое же, как и в первой.

- C++
- Работа с файлами
- blog
- it
- programming
- если в матрице есть нулевая строка, то все строки ниже нее также нулевые;
- пусть aij не равное 0 — первый ненулевой элемент в строке с индексом i , т.е. элементы ail = 0 при l < j . Тогда все элементы в j -м столбце ниже элемента aij равны нулю, и все элементы левее и ниже aij также равны нулю: akl = 0 при k > i и l =< j .
- Преобразование первого рода:две строки матрицы меняются местами, и при этом знаки всех элементов одной из строк изменяются на противоположные.
- Преобразование второго рода:к одной строке матрицы прибавляется другая строка, умноженная на произвольное число.
- ищем сначала ненулевой элемент в первом столбце. Если все элементы первого столбца нулевые, то переходим ко второму столбцу, и так далее. Если нашли ненулевой элемент в k -й строке, то при помощи элементарного преобразования первого рода меняем местами первую и k -ю строки, добиваясь того, чтобы первый элемент первой строки был отличен от нуля;
- используя элементарные преобразования второго рода, обнуляем все элементы первого столбца, начиная со второго элемента. Для этого от строки с номером k вычитаем первую строку, умноженную на коэффициент ak1/a11 .
- переходим ко второму столбцу (или j -му, если все элементы первого столбца были нулевыми), и в дальнейшем рассматриваем только часть матрицы, начиная со второй строки и ниже. Снова повторяем пункты 1) и 2) до тех пор, пока не приведем матрицу к ступенчатому виду.
- индексы строк и столбцов матрицы начинаются с нуля, а не с единицы;
- недостаточно найти просто ненулевой элемент в столбце. В программировании все действия с вещественными числами производятся приближенно, поэтому можно считать, что точного равенства вещественных чисел вообще не бывает. Некоторые компиляторы даже выдают предупреждения на каждую операцию проверки равенства вещественных чисел. Поэтому вместо проверки на равенство нулю числа aij следует сравнивать его абсолютную величину |aij| с очень маленьким числом
(например,
). Если
то j увеличивается на единицу (считается, что столбец нулевой). Иначе перестановкой строк разрешающий элемент ставится на вершину j -го столбца минора, и затем столбец обнуляется элементарными преобразованиями второго рода. После этого оба индекса i и j увеличиваются на единицу. Алгоритм завершается, когда либо i = m , либо j = n . По окончании алгоритма значение переменной i равно числу ненулевых строк ступенчатой матрицы, т.е. рангу исходной матрицы.
КАК правильно считать матрицу из текстового файла?
int _tmain(int argc, _TCHAR* argv[])
<
int N=3,a[3][3],i,j;
FILE *in;
if((in = fopen(«in.txt»,»r»))==NULL)
<
cout << «error» << endl;
return 0;
>
fscanf(in,»%d»,&N); //Считали N
for(i=0;i<N;i++) //считываем матрицу
<
for(j=0;j<N;j++)
4 ответа
мде. сколько раз уже писали — если C++, то нужно юзать fstream .
#include <fstream>
#include <iostream>
#include <conio.h>
using namespace std;
void main()
<
ifstream inp(«in.txt»);
int len;
inp >> len;
int buf = 0;
for(int i = 0; i < len; ++i)
<
inp >> buf;
cout << buf << endl;
>
по аналогии с твоей задачей. если каждый символ в файле — элемент матрицы, то и считывай по 1 символу, т.е. по char, а потом конвертируй его в число.
а любая ф-ция чтения будет считывать число до разделительного символа(пробел, табуляция, перевод строки, конец файла)