Программа не выдает сообщение об ошибке - C (СИ)
Формулировка задачи:
Добрый день.
Есть программа, которая должна прочитать 10 чисел из файла input.dat, умножить каждое из них на 2 и записать результат в output.dat. От себя добавил только #include <conio.h> и getch :
Если файла input.dat нет, программа как положено выдает сообщение "Нет файла данных". Если в файле есть числа (через пробел или построчно) - считает и создает файл/перезаписывает файл output.dat с правильными результатами (все числа умножены на 2). Но если файл input.dat пустой, то вместо вывода задуманного сообщения об ошибке - "Не хватает данных в файле", записывает в output.dat результат такого вида (цифры каждый раз разные):
-1787724184
-4
-281464396
-281329164
9577392
9577024
4587120
-281330118
0
0
По задумке, программа должна выдавать сообщение об ошибке, если файл input.dat пуст, т.е. в нем нет данных (или их не хватает). Предположил, что возможно в этой строчке:
if ( 0 == fscanf(fp,"%d",&A[i]) ) { // чтение и обработка
ошибка и нужно исправить на:
if ( fscanf(fp,"%d",&A[i]) == 0) { // чтение и обработка
но результат не изменился.
Думаю это не со средой и компилятором связано, а с самим примером (но на всякий случай - пробовал на Dev-С++ и Code::Blocks).
#include <stdio.h> #include <conio.h> const int N = 10; main() { int i, A[N]; FILE *fp; // указатель на файл fp = fopen( "C:\\Data\\input.dat", "r" ); // открыть файл на чтение if ( fp == NULL ) { // обработка ошибки printf("Нет файла данных"); getch (); return 1; // выход по ошибке, код ошибки 1 } for ( i = 0; i < N; i ++ ) if ( 0 == fscanf(fp,"%d",&A[i]) ) { // чтение и обработка printf("Не хватает данных в файле"); // ошибки getch (); break; } fclose ( fp ); // закрыть файл for ( i = 0; i < N; i ++ ) A[i] = A[i] * 2; fp = fopen( "C:\\Data\\output.dat", "w" ); // открыть файл на запись for ( i = 0; i < N; i ++ ) // вывести массив в файл fprintf ( fp, "%d\n", A[i] ); // в столбик fclose ( fp ); }
Решение задачи: «Программа не выдает сообщение об ошибке»
textual
Листинг программы
if(fLen < sizeof(int)*N + strlen(" ")*(N-2)*sizeof(char))
Объяснение кода листинга программы
- Переменная
fLen
содержит размер файла в байтах. - Переменная
N
содержит количество элементов в массиве. - В выражении
sizeof(int)*N
вычисляется размер массива в байтах. - В выражении
strlen(
)*(N-2)*sizeof(char)
вычисляется дополнительный размер массива для хранения строк, содержащих - Результат вычисления используется в условии проверки
if
. - Если размер файла меньше, чем сумма размера массива и дополнительного размера для строк, то программа продолжает работу.
- Если условие не выполняется, то программа выдает сообщение об ошибке.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д