Программа не выдает сообщение об ошибке - 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. - Если размер файла меньше, чем сумма размера массива и дополнительного размера для строк, то программа продолжает работу.
- Если условие не выполняется, то программа выдает сообщение об ошибке.