Чтение из файла в массив на Си (начинающий)
Поможите пожалуйста!
Есть файл 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;i
( 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"); >