4 / 1 / 2
Регистрация: 04.12.2010
Сообщений: 65
1

Вопрос про возврат значения из функции ("Функция должна возвращать нулевое значение, если чтение прошло успешно, и -1 в противном случае")

03.02.2011, 22:25. Показов 3406. Ответов 7
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Из описания программы:
Написать функцию, которая извлекает из этого файла данные о сканере в структуру типа scan_info. Обязательный параметр номер требуемой записи. Функция должна возвращать нулевое значение, если чтение прошло успешно, и -1 в противном случае.
Как я поняла эту часть:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
int readStructure(scan_info *output_item, FILE *text_file)
{
    int number;
     if((text_file=freopen("file", "r+b", text_file)) == NULL )
        { 
            printf ("\nFile does not exist.\n");
            return -1;
        }
 
    printf ("\n\nВведите номер позиции: ");
    scanf ("%d", &number);
    fseek(text_file,sizeof(int)+(number-1)*sizeof(scan_info),SEEK_SET);
    fread (output_item,sizeof(scan_info),1,text_file);
    printf("\nМодель: %s", output_item->model);
 
    // вывод остальных полей
 
    fclose(text_file);
 
    return 0;
}
C
1
2
3
4
5
6
7
8
struct scan_info {
char model[25]; // наименование модели
int price;  // цена
double x_size;  // горизонтальный размер области сканирования
double y_size;  // вертикальный размер области сканирования
int optr;   // оптическое разрешение
int grey;   // число градаций серого
};//структура
Не очень понятна строчка из описания "Функция должна возвращать нулевое значение, если чтение прошло успешно, и -1 в противном случае", а именно:
1) "чтение прошло успешно" - имеется в виду, что файл открылся? или какая-то еще проверка?
2) "функция должна возвращать ... -1 в противном случае" - какой смысл в том, что эта функция возвращает 0 или -1? т.е. как и где можно попробовать использовать значение, которое вернула функция?
Поясните, пожалуйста.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.02.2011, 22:25
Ответы с готовыми решениями:

Если значение равно или меньше нуля, то функция возвращает False, в противном случае True
Георгий написал функцию is_alive(health), которая проверяет здоровье. Если оно равно или меньше...

Почему при вызове функции она возвращает 4 значения, если должна возвращать 2
Добрый день. Столкнулся с такой проблемой. Почему при вызове функции она возвращает 4 значения,...

Если значения переменных упорядочны по возрастанию или убыванию то удвоить их; в противном случае заменить значение каждой перемной на противоположную
ПОЖАЛУЙСТА ЛЮДИ ПОМОГИТЕ РЕШАТЬ 5 ЗАДАЧ ПРОСТО У МЕНЯ НЕТУ ВРЕМЕНИ РЕШАТЬ ПОМОГИТЕ ПЛЗЗЗЗ !!!!! ...

Программа должна вывести YES, если школьник дал верный ответ и NO в противном случае
В условии одной из задач на этом сайте написано: “Если данное четырехзначное число является...

7
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
03.02.2011, 22:34 2
1) Да, подозреваю, именно проверка на открытие файла.
2) Мы можем проверять, правильно ли отработала функция, т.е. заполнила ли она output_item, и можем ли мы эти данные в дальнейшем использовать. В случае неудачи, мы, например, можем предоставить пользователю выбор, попробовать ли считать данные ещё раз или завершить программу.
1
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
04.02.2011, 17:25 3
Цитата Сообщение от chaosfall Посмотреть сообщение
"чтение прошло успешно" - имеется в виду, что файл открылся? или какая-то еще проверка?
Да, здесь проверяется именно открытие файла, хотя это не соответсвует спецификации функции. Сказано, что
Цитата Сообщение от chaosfall Посмотреть сообщение
Функция должна возвращать нулевое значение, если чтение прошло успешно, и -1 в противном случае.
но функция не обрабатывает ситуации, когда файл открылся, а fseek или fread завершились с ошибкой, т.е. не обрабатывается ошибки в работе с успешно открытым файлом. Так что в строках 12 и 13 надо бы добавить проверку возращаемых значений соответствующих функций, а строки 11 и 14 вообще хорошо было бы вынести за пределы функции.
1
4 / 1 / 2
Регистрация: 04.12.2010
Сообщений: 65
05.02.2011, 01:58  [ТС] 4
Спасибо большое за комментарии!

Переделала код с учетом вышесказанного, скажите, пожалуйста, если есть еще какие-то недочеты:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main ()
{
///...
    printf ("\n\nВведите номер позиции: "); 
    scanf ("%d", &number);
 
//вызов функции на чтение записи из файла и проверка возвращаемого значения
    if (readStructure (&output_item, text_file, &number)) {printf ("Ошибка чтения. Программа будет завершена."); return 1;}; 
 
//вывод полей структуры, прочитанной из файла
    printf("\nМодель: %s", output_item.model);
    printf("\nЦена: %d", output_item.price);
    printf("\nГоризонтальный размер области сканирования: %lf", output_item.x_size);
    printf("\nВертикальный размер области сканирования: %lf", output_item.y_size);
    printf("\nОптическое разрешение: %d", output_item.optr);
    printf("\nЧисло градаций серого: %d", output_item.grey);
 
system ("pause");
return 0;
}
реализация функции readStructure
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
int readStructure(scan_info *output_item, FILE *text_file, int *number)
{
    int result=0;
     if((text_file=freopen("file", "r+b", text_file)) == NULL )
        { 
            printf ("\nФайл не найден.\n");
            return -1;
        }
 
    if (fseek(text_file,sizeof(int)+(*number-1)*sizeof(scan_info),SEEK_SET) != 0) return -1;
    result=fread (output_item,sizeof(scan_info),1,text_file);
    if (result!=1) {fputs ("Ошибка чтения.",stderr); return -1;}
    fclose(text_file);
 
    return 0;
}
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
05.02.2011, 05:43 5
chaosfall, есть несколько мелких замечаний. Я бы передавал в функцию указатель на уже открытый файловый поток (это бы сделало функцию более универсальной, т.к. можно было бы обрабатывать файлы с произвольным именем, а не только с именем "file", которое сейчас жестко "зашито" в теле функции). Непонятно, почему number передается по ссылке, а не по значению, если его модификация внутри функции не подразумевается. Сообщения об ошибке внутри самой функции, ИМХО, излишни, т.к. они дублируются уровнем выше в вызывающей функции.
2
4 / 1 / 2
Регистрация: 04.12.2010
Сообщений: 65
06.02.2011, 01:04  [ТС] 6
Цитата Сообщение от Nameless One Посмотреть сообщение
Я бы передавал в функцию указатель на уже открытый файловый поток (это бы сделало функцию более универсальной, т.к. можно было бы обрабатывать файлы с произвольным именем, а не только с именем "file", которое сейчас жестко "зашито" в теле функции).
Если я правильно понимаю этот комментарий, то нужно просто вынести открытие и закрытие файлового потока за пределы функций?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <windows.h>
 
struct scan_info {
char model[25]; // наименование модели
int price;  // цена
double x_size;  // горизонтальный размер области сканирования
double y_size;  // вертикальный размер области сканирования
int optr;   // оптическое разрешение
int grey;   // число градаций серого
};
 
void addStructure(scan_info *, int, FILE *);
int readStructure(scan_info *, FILE *, int);
 
int main ()
{
 
    setlocale (LC_ALL, "Russian");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
int i=0, n_of_items=0, number=0;
FILE *text_file, *pfile;
scan_info *input_item, output_item;
 
    printf ("\nВведите количество записей, которое вы хотите добавить в файл:\n");
    scanf ("%d", &n_of_items);
    input_item = new scan_info[n_of_items];
 
if (input_item == NULL) printf ("Ошибка выделения памяти"); 
 
if((text_file=fopen("file","w+b")) == NULL )
        { 
            printf ("\nFile not exist.\n");
            getch();
            exit(1);
        }
fwrite (&n_of_items, sizeof(int), 1, text_file);
addStructure(input_item, n_of_items, text_file);
fclose(text_file);
 
 
    printf ("\n\nВведите номер позиции: ");
    scanf ("%d", &number);
 
if((pfile=freopen("file", "r+b", text_file)) == NULL ){printf ("Ошибка при открытии файла."); return -1;};
 
if (fseek(pfile,sizeof(int)+(number-1)*sizeof(scan_info),SEEK_SET) != 0) {printf ("Ошибка."); return -1;}
if (readStructure (&output_item, pfile, number)) {printf ("Ошибка чтения. Программа будет завершена."); return -1;};
 
fclose(text_file);
 
    printf("\nМодель: %s", output_item.model);
    printf("\nЦена: %d", output_item.price);
    printf("\nГоризонтальный размер области сканирования: %lf", output_item.x_size);
    printf("\nВертикальный размер области сканирования: %lf", output_item.y_size);
    printf("\nОптическое разрешение: %d", output_item.optr);
    printf("\nЧисло градаций серого: %d\n", output_item.grey);
 
delete [] input_item;
system ("pause");
return 0;
}
 
void addStructure(scan_info *input_item, int n_of_items, FILE *text_file)
{
    for (int i=0;i<n_of_items;i++)
        {
            printf ("\nВвод данных о сканере %d\n", i+1);
            fflush(stdin);
            printf ("Введите наименование модели сканера: ");
            scanf("%s",&input_item[i].model);
            fflush(stdin);
            printf ("Введите цену модели сканера: ");
            scanf("%d", &input_item[i].price);
            fflush(stdin);
            printf ("Введите горизонтальный размер области сканирования: ");
            scanf("%lf", &input_item[i].x_size);
            fflush(stdin);
            printf ("Введите вертикальный размер области сканирования: ");
            scanf("%lf", &input_item[i].y_size);
            fflush(stdin);
            printf ("Введите оптическое разрешение: ");
            scanf("%d", &input_item[i].optr);
            fflush(stdin);
            printf ("Введите число градаций серого: ");
            scanf("%d", &input_item[i].grey);
            fwrite(&input_item[i], sizeof(scan_info), 1, text_file);
        }
}
 
 
int readStructure(scan_info *output_item, FILE *pfile, int number)
{
    int result=0;
    result=fread(output_item,sizeof(scan_info),1,pfile);
    if (result!=1)  return -1;
    return 0;
}
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
06.02.2011, 06:43 7
Цитата Сообщение от chaosfall Посмотреть сообщение
Если я правильно понимаю этот комментарий, то нужно просто вынести открытие и закрытие файлового потока за пределы функций?
Да, это я и имел в виду. А зачем убирать fseek из функции readStructure? Тогда передаваемый параметр number в функции никак не используется.
1
4 / 1 / 2
Регистрация: 04.12.2010
Сообщений: 65
06.02.2011, 15:18  [ТС] 8
Хм, совсем не помню, как fseek переместилось за пределы функции.. вернула на место)
И еще выделила функцию вывода структуры на консоль, чтобы не захламлять основное тело программы - функцию main.

Nameless One, спасибо большое за ценные советы.

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <windows.h>
 
struct scan_info {
char model[25]; // наименование модели
int price;  // цена
double x_size;  // горизонтальный размер области сканирования
double y_size;  // вертикальный размер области сканирования
int optr;   // оптическое разрешение
int grey;   // число градаций серого
};
 
void addStructure(scan_info *, int, FILE *);
int readStructure(scan_info *, FILE *, int);
void showStructure (scan_info);
 
int main ()
{
 
    setlocale (LC_ALL, "Russian");
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
 
int i=0, n_of_items=0, number=0;
FILE *text_file, *pfile;
scan_info *input_item, output_item;
 
    printf ("\nВведите количество записей, которое вы хотите добавить в файл:\n");
    scanf ("%d", &n_of_items);
    input_item = new scan_info[n_of_items];
 
if (input_item == NULL) printf ("Ошибка выделения памяти"); 
 
if((text_file=fopen("file","w+b")) == NULL )
        { 
            printf ("\nFile not exist.\n");
            getch();
            exit(1);
        }
fwrite (&n_of_items, sizeof(int), 1, text_file);
addStructure(input_item, n_of_items, text_file);
fclose(text_file);
 
    printf ("\n\nВведите номер позиции: ");
    scanf ("%d", &number);
 
if((pfile=freopen("file", "r+b", text_file)) == NULL ){printf ("Ошибка при открытии файла"); return -1;};
if (readStructure (&output_item, pfile, number)) {printf ("Ошибка чтения. Программа будет завершена."); return -1;}; 
fclose(text_file);
 
showStructure(output_item);
 
delete [] input_item;
system ("pause");
return 0;
}
 
void addStructure(scan_info *input_item, int n_of_items, FILE *text_file)
{
    for (int i=0;i<n_of_items;i++)
        {
            printf ("\nВвод данных о сканере %d\n", i+1);
            fflush(stdin);
            printf ("Введите наименование модели сканера: ");
            scanf("%s",&input_item[i].model);
            fflush(stdin);
            printf ("Введите цену модели сканера: ");
            scanf("%d", &input_item[i].price);
            fflush(stdin);
            printf ("Введите горизонтальный размер области сканирования: ");
            scanf("%lf", &input_item[i].x_size);
            fflush(stdin);
            printf ("Введите вертикальный размер области сканирования: ");
            scanf("%lf", &input_item[i].y_size);
            fflush(stdin);
            printf ("Введите оптическое разрешение: ");
            scanf("%d", &input_item[i].optr);
            fflush(stdin);
            printf ("Введите число градаций серого: ");
            scanf("%d", &input_item[i].grey);
            fwrite(&input_item[i], sizeof(scan_info), 1, text_file);
        }
}
 
int readStructure(scan_info *output_item, FILE *pfile, int number)
{
    int result=0;
    if (fseek(pfile,sizeof(int)+(number-1)*sizeof(scan_info),SEEK_SET) != 0) return -1;
    result=fread(output_item,sizeof(scan_info),1,pfile);
    if (result!=1)  return -1;
    return 0;
}
 
void showStructure (scan_info output_item)
{
    printf("\nМодель: %s", output_item.model);
    printf("\nЦена: %d", output_item.price);
    printf("\nГоризонтальный размер области сканирования: %lf", output_item.x_size);
    printf("\nВертикальный размер области сканирования: %lf", output_item.y_size);
    printf("\nОптическое разрешение: %d", output_item.optr);
    printf("\nЧисло градаций серого: %d\n", output_item.grey);
}
0
06.02.2011, 15:18
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.02.2011, 15:18
Помогаю со студенческими работами здесь

Машина Тьюринга должна выдать 0, если число нулей больше и 1 – в противном случае
доброго времени суток Надо написать правила машины Тьюринга для решения задачи: На вход...

Если элемент четный, то запись должна быть зеленого цвета, в противном случае лилового
Введите элементы массива в список. При выборе элемента должно быть указано, элемент четный или не...

В каком случае функция fread() возращает нулевое значение?
В каком случае функция fread() возращает нулевое значение? Си

Присвоить логической переменной T значение true, если значение d-цифра, и значение false в противном случае
Имеется символьная переменная d, присвоить логической переменной T значение true, если значение...

Переменной b присвоить значение 0 если x и y равны, и значение 1 в противном случае
Заданы числа x и y.Переменной b присвоить значение 0 если x и y равны,и значение 1 в противном...

Вычислить значение y: y=1, если есть x<10, в противном случае y=0
y=1, если есть x&lt;10 в противном случае y=0

Ошибка функция должна возвращать значение
Добрый вечер! Написала функцию, написала return, не понимаю, почему выдает ошибку, что функция...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru