Работа с чтением из файла - C (СИ)
Формулировка задачи:
Привет ребята, пишу прошу для копирования ЕЕРROM по I2C одного устройства в другое, и возникла следующая проблема,
я считываю в текстовый файл что есть в памяти и сохраняю в файл test.txt.
Данные храняться в файле test.txt в виде по 16 чисел в строчку потом ; и потом аски значения, если число 0х00 то ставиться точка. Данные начинаются со второй строчки в первой пишется N20R10, это значения которые мне нужно будет потом спарсить.
Вот так выглядит файл, только строчек в нем очень много.
N20R10
30 00 00 00 00 00 00 00 00 00 00 00 00 00 00 31 ; 0..............1
...
...
Собственно говоря теперь вопросы. Как работать с этим файлом? Как с двумерным массивом? Мне эти данные потом нужны будут для того чтобы отправить по I2C. Вот что на данный момент есть. Оно работает с файлом без ; и расшифровки, вычитывает эти значения и выводит в консоль. Буду благодарен за любые советы
а остальные строки как? ограничить чтоли в fgets второй аргумент позицией точки з запятой? и потом уже каждое число парсить из чаров типа 01 в 0х01?
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- #include <sys/types.h>
- int main ( void )
- {
- static const char filename[] = "1.txt";
- FILE *file = fopen ( filename, "r" );
- int i, j;
- char res;
- char arra[128][128] = {'\0'};
- char line[128] = {'\0'};
- if ( file != NULL )
- {
- while ( fgets ( line, sizeof line, file ) != NULL )
- {
- strcpy(arra, line);
- printf("array ----> %s ", &arra);
- }
- fclose ( file ); }
- else{
- perror ( filename );
- }
- return 0;
- }
поразмыслив немного и понял что первую строку можна считать достаточно просто
Листинг программы
- char sys_info[16];
- ...
- fgets(sys_info, sizeof(sys_info), file);
Решение задачи: «Работа с чтением из файла»
textual
Листинг программы
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include <sys/types.h>
- int main ()
- {
- FILE *file = NULL;
- file = fopen("1.txt","r");
- if(file == NULL){
- puts("Error opening file!");
- exit(1);
- }
- int i = 0, j = 0, k = 0;
- char arra[128][128];
- char line[128];
- fgets (line, 127, file);
- puts(line);
- while ( fgets (line, 128, file) ){
- j = 0;
- k = 0;
- while(1){
- arra[i][j] = line[k];
- if(line[k] == ';') break;
- j++;
- k++;
- }
- i++;
- }
- fclose ( file );
- for(j = 0; j < i; j++)
- printf("array ----> %s\n", arra[j]);
- return 0;
- }
Объяснение кода листинга программы
- Подключение необходимых библиотек для работы с файлами и строками
- Объявление переменной
file
типаFILE*
для работы с файлом - Открытие файла
1.txt
в режиме чтения с помощью функцииfopen()
- Проверка на успешное открытие файла. Если файл не открылся, выводится сообщение об ошибке и программа завершается
- Объявление трех переменных типа
int
для подсчета строк, столбцов и индекса массива - Объявление двумерного массива
arra
типаchar
размером 128x128 для хранения данных из файла - Объявление переменной
line
типаchar
для чтения строки из файла - Чтение первой строки из файла с помощью функции
fgets()
- Вывод первой строки на экран с помощью функции
puts()
- Цикл
while
, который будет выполняться до тех пор, пока не достигнут конец файла - Внутри цикла, инициализация трех переменных типа
int
для обработки текущей строки - Чтение строки из файла с помощью функции
fgets()
- В цикле
while
происходит обработка каждого символа строки - Каждый символ строки записывается в соответствующую ячейку массива
arra
- Если символ строки равен ';', то цикл
while
прерывается - Увеличение индекса массива
i
после каждой прочитанной строки - Закрытие файла с помощью функции
fclose()
- Цикл
for
, который будет выполняться для вывода всех строк массива на экран - Вывод строки на экран с помощью функции
printf()
- Возврат значения 0, что означает успешное завершение программы
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д