Чтение файла, как сделать прогон по всем строкам файла - C (СИ)
Формулировка задачи:
Вот вообщем задание:
Составить текстовый файл, состоящий из нескольких строк следующего вида:<количество чисел в строке> <число 1><чиссло 2>...<число N>.
Написать функцию нахождения произведения элементов массива произвольного размера. В программе последовательно читать из файла строки чисел, создавать динамический массив,
размер которого соответствует числу чисел в строке файла, затем вычислять сумму числовой последовательности. Результат вывести на экран.
у меня не получается сделать чтение по строкам
#include <stdio.h>
#include <conio.h>
#include <math.h>
double proizv(float mas[100], int nn)
{
int l;
float pro=1;
for (l=0;l<nn;l++)
{
pro*=mas[l];
}
return pro;
}
void main(void)
{
float massiv[100], m;
int i,j=1,n;
FILE *inp;
inp = fopen ("C:\\BORLANDC\\tyt\\file\\test.txt","r");
if (inp==NULL)
printf ("Owibka pri otkritii faila.\n");
printf ("proizvedenie el. massiva v stroke %d :\n",j);
fscanf (inp,"%d",&n);
printf ("massiv dlinnoi - %d\n",n);
for (i=0;i<n;i++)
fscanf(inp,"%f",&massiv[i]);
for (i=0;i<n;i++)
printf ("%4.2f ",massiv[i]);
m=proizv(massiv,n);
printf ("\nproizvedeine elementov massiva - %4.2f\n\n",m);
}Решение задачи: «Чтение файла, как сделать прогон по всем строкам файла»
textual
Листинг программы
#include <stdio.h>
#include <stdlib.h>
#include <stddef.h>
#define FILENAME "C:\\BORLANDC\\tyt\\file\\test.txt"
float multiplication(const float* arr, size_t size);
int main(void)
{
float* arr = NULL;
size_t i = 0, row = 0, size = 0;
FILE* file = NULL;
if ((file = fopen(FILENAME, "r")) == NULL)
{
perror("Error occurred: ");
exit(1);
}
while (fscanf(file, "%d", &size) == 1)
{
if ((arr = (float*)malloc(size * sizeof(float))) == NULL)
{
printf("%s", "Error occurred: cannot allocate memory");
fclose(file);
exit(1);
}
for (i = 0; i < size; ++i)
{
if (fscanf(file, "%f", &arr[i]) != 1)
{
perror("Error occurred: ");
free(arr);
exit(1);
}
}
printf("row# %d sum %f", ++row, multiplication(arr, size));
free(arr);
}
}
float multiplication(const float* arr, size_t size)
{
int i = 0;
float res = 0.0f;
for (; i < size; ++i)
res *= arr[i];
return res;
}
Объяснение кода листинга программы
- В начале кода подключаются необходимые библиотеки: stdio.h, stdlib.h, stddef.h.
- Определена константа FILENAME, которая содержит путь к файлу.
- В функции main() инициализированы необходимые переменные:
- arr - указатель на массив, который будет содержать числа из файла.
- i - счётчик для прохода по элементам массива.
- row - счётчик для прохода по строкам файла.
- size - переменная для хранения количества элементов в текущей строке.
- file - указатель на файл, который будет использоваться для чтения данных.
- Если файл не может быть открыт, выводится сообщение об ошибке и программа завершается.
- В цикле while считывается каждая строка из файла до тех пор, пока не будет достигнут конец файла.
- Для каждой строки выделяется память под массив чисел и считываются сами числа.
- Если при считывании числа произошла ошибка (например, конец строки), выводится сообщение об ошибке, освобождается память и программа завершается.
- Вычисляется сумма чисел в текущей строке с помощью функции multiplication().
- Результат выводится на экран.
- После завершения цикла освобождается память, выделенная под массив чисел.
- В функции multiplication() происходит умножение чисел из массива и возвращается результат.