Как считать матрицу из файла си
Перейти к содержимому

Как считать матрицу из файла си

  • автор:

Чтение из файла в массив на Си (начинающий)

Поможите пожалуйста!
Есть файл file с содержание типа 3 6 3 1.
Нужно прочитать файл и записать каждую цифру в массив. (число строк в файле известно заранее)
Пробовал так:
for (i = 0; i < n ; i++)
<
a[i] = getc(fp);
printf(«%d\n», a[i]);
>
или может пойти выспаться?

anonymous
30.11.03 03:32:23 MSK
anonymous
( 30.11.03 11:21:27 MSK )
Ответ на: комментарий от anonymous 30.11.03 11:21:27 MSK
anonymous
( 30.11.03 14:40:47 MSK )
Ответ на: комментарий от anonymous 30.11.03 11:21:27 MSK

а разве он не начнет пробелы считыват %)

anonymous
( 30.11.03 16:58:12 MSK )
Ответ на: комментарий от anonymous 30.11.03 16:58:12 MSK

Да, начал. Товарищ предыдущий anonymous, может быть подскажите что?

anonymous
( 30.11.03 18:14:48 MSK )
Ответ на: комментарий от anonymous 30.11.03 18:14:48 MSK

Посмотри man fscanf

OxiD ★★★★
( 01.12.03 11:12:06 MSK )
DKorolkov ★
( 01.12.03 11:47:34 MSK )
Ответ на: комментарий от DKorolkov 01.12.03 11:47:34 MSK

Если на С++, то еще проще:

Flogger_d ★
( 01.12.03 12:10:30 MSK )
Ответ на: комментарий от Flogger_d 01.12.03 12:10:30 MSK

C++ не катит.
Вот что у меня получилось: правда работает бредово и не считает пробелы 🙁
— числа выводятся не в том формате. info printf ничем не помог.

int main(int argc, char* argv[])
<
char* path = argv[1];
int i;
unsigned char buffer[16];
size_t offset = 0;
size_t bytes_read;
int fd = open(path, O_RDONLY);
if (fd == -1)
<
perror («open»);
return 1;
>
do <
bytes_read = read(fd, buffer, sizeof (buffer));
>
while (bytes_read == sizeof (buffer));
for (i=0; i < bytes_read; i++)
printf(«%d», buffer[i]);
printf(«\n»);

anonymous
( 01.12.03 17:10:15 MSK )
Ответ на: комментарий от anonymous 01.12.03 17:10:15 MSK

Так тебе что — просто файл на экране распечатать — или массив с цифрами заполнить?
Если первое — то можно просто по символу читать поток и кидать сразу на вывод, не заморачиваясь с буфером — все равно оно буферизуется , если пользуешься f-функциями.
Если второе — то твоя программа все равно этого не делает и нужно использовать fscanf:

#define HOW_MANY 100
/* здесь — сколько цифр в файлике */

int main(int ac, char** av)<
char cyphers[HOW_MANY];
FILE* f;
int i;

Flogger_d ★
( 01.12.03 17:33:42 MSK )
Ответ на: комментарий от Flogger_d 01.12.03 17:33:42 MSK

В fopen av — понятное дело — в нижнем регистре

Flogger_d ★
( 01.12.03 17:36:23 MSK )
Ответ на: комментарий от Flogger_d 01.12.03 17:36:23 MSK

Да, и на счет массива я прогнал — он должен быть типа int а не char.

Flogger_d ★
( 01.12.03 17:38:00 MSK )
Ответ на: комментарий от Flogger_d 01.12.03 17:38:00 MSK

Да, мне нужно именно загнать в массив.
А вывожу я просто для проверки.

anonymous
( 01.12.03 18:20:16 MSK )
Ответ на: комментарий от anonymous 01.12.03 18:20:16 MSK

Так что — победил или нет?

Flogger_d ★
( 02.12.03 12:57:23 MSK )
Ответ на: комментарий от Flogger_d 02.12.03 12:57:23 MSK

Частично, т.к. это было только начало.
надо чтобы заводился двуменрый массив из файла вида:
1 2 3 4
5 6 7 9
4 9 9 8

Буду пробовать на выходных.

anonymous
( 02.12.03 13:43:22 MSK )
Ответ на: комментарий от anonymous 02.12.03 13:43:22 MSK

#include #include #define ROWS 10 #define COLS 15 // // Считать в массив матрицу из файла, размерность // матрицы считать ROWS строк и COLS столюцов // int main() < int ** array; int i; int j; // // распределить память! // array = (int**) malloc(sizeof(int*)*ROWS); for (i=0;ino-dashi ★★★★★
( 02.12.03 20:52:32 MSK )
Ответ на: комментарий от no-dashi 02.12.03 20:52:32 MSK

а нафига собственно такую структуру городить в памяти? элементарно заводим сплошной кусок и индексируемся в нем типа m[i][j]==m[i*COLUMNS+j]

Как считать матрицу из файла си

Регистрация: 21.11.2007

Сообщений: 1,063

Вам ведь в Вашей-же теме:
http://programmersforum.ru/showthread.php?t=327937
сказали:
— Код рабочий.
Т.е. читается матрица из «input.txt» и выводится в косоли.
Проверте правильность указания маршрута к файлу.
И сам файл просили показать в теме.

А по этой теме — Вы объявляете два массива на 10000 и 100 символов:

 //Обьявление матрицы int arr[100][100]; int p = 0; string mas; char a[100];

и если я правильно понимаю, запихиваете 10000-ый массив в 100 символьный:

while (!fin.eof()) < fin >> a; p++

I am not a wizard, I am just learning.

Считывание матрицы из файла на C++

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

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

Принцип работы такой:

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

Программа является обучающим примером и содержит ряд недостатков, таких как:

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

Вот код самой программы:

#include #include using namespace std; int main()  setlocale(LC_ALL, "RUSSIAN"); //Создаем файловый поток и связываем его с файлом ifstream in("input.txt"); if (in.is_open())  //Если открытие файла прошло успешно //Вначале посчитаем сколько чисел в файле int count = 0;// число чисел в файле int temp;//Временная переменная while (!in.eof())// пробегаем пока не встретим конец файла eof  in >> temp;//в пустоту считываем из файла числа count++;// увеличиваем счетчик числа чисел > //Число чисел посчитано, теперь нам нужно понять сколько //чисел в одной строке //Для этого посчитаем число пробелов до знака перевода на новую строку //Вначале переведем каретку в потоке в начало файла in.seekg(0, ios::beg); in.clear(); //Число пробелов в первой строчке вначале равно 0 int count_space = 0; char symbol; while (!in.eof())//на всякий случай цикл ограничиваем концом файла  //теперь нам нужно считывать не числа, а посимвольно считывать данные in.get(symbol);//считали текущий символ if (symbol == ' ') count_space++;//Если это пробел, то число пробелов увеличиваем if (symbol == '\n') break;//Если дошли до конца строки, то выходим из цикла > //cout //Опять переходим в потоке в начало файла in.seekg(0, ios::beg); in.clear(); //Теперь мы знаем сколько чисел в файле и сколько пробелов в первой строке. //Теперь можем считать матрицу. int n = count / (count_space + 1);//число строк int m = count_space + 1;//число столбцов на единицу больше числа пробелов double **x; x = new double*[n]; for (int i = 0; in; i++) x[i] = new double[m]; //Считаем матрицу из файла for (int i = 0; i  n; i++) for (int j = 0; j  m; j++) in >> x[i][j]; //Выведем матрицу for (int i = 0; i  n; i++)  for (int j = 0; j  m; j++) cout  <x[i][j]  <"\t"; cout  <"\n"; > for (int i = 0; in; i++) delete[] x[i]; delete[] x; in.close();//под конец закроем файла > else  //Если открытие файла прошло не успешно cout  <"Файл не найден."; > system("pause"); return 0; > 

Если у нас такой файл input.txt :

3 5 69 1 12 3 48 69 2 

То получим вот такое при запуске программы:

Считать числа из текстового файла в массив (Си)

Задача В текстовом файле INPUT.TXT записаны целые числа через пробел, возможно, в несколько строк. Сформировать список (массив) этих чисел. Решение Для начала, программа должна открыть файл INPUT.TXT для чтения, для этого используется функция fopen с опцией «r» . Если файл не удалось открыть — она возвращает нулевой указатель:

int main() < FILE* input = fopen("INPUT.TXT", "r"); if (input == 0) < printf("cant open file\n"); return 1; >// .

Теперь (если файл успешно открыт) можно считать его содержимое в массив. Для ввода целых чисел с файла в Си применяется функция fscanf опцией «%d» . Однако, нам нужно считать числа в массив, а значит — массив надо предварительно создать (с помощью функции malloc ). Создание массива — это выделение памяти и нужно знать сколько выделять памяти, но мы не знаем сколько чисел в файле — поэтому перед тем как создавать массив необходимо пройтись по всему файлу и посчитать в нем количество целых чисел. Напишем для этого вспомогательную функцию:

int numberCount(FILE* input) < fseek(input, 0, SEEK_SET); int counter = 0; while (true) < int value; if (fscanf(input, "%d", &value) == 1) counter++; if (feof(input)) break; >return counter; >

В начале своей работы функция устанавливает с помощью fseek указатель (позицию) чтения на начала файла — относительно начала ( SEEK_SET ) на ноль позиций. Далее — в цикле последовательно считывает числа с файла с помощью fscanf . После ввода каждого числа с помощью feof проверяет не был ли поднят флаг конца файла. Если файл кончился — выходит из цикла и возвращает значение счетчика. Теперь мы можем выделить память под массив в функции main:

int size = numberCount(input); int* numbers = (int*)malloc(sizeof(int) * size);

И считать числа с файла в массив, для этого еще раз проходимся по файлу и считываем с него заданное количество чисел:

void read_numbers(FILE* input, int size, int* numbers) < fseek(input, 0, SEEK_SET); for (int i = 0; i < size; ++i) < fscanf(input, "%d", &numbers[i]); >>

Также, напишем вспомогательную функцию для вывода содержимого массива на экран:

void print_array(int* numbers, int size) < for (int i = 0; i < size; ++i) < printf("%d ; ", numbers[i]); >printf("\n"); >

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *