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

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

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

Из описания программы:
Написать функцию, которая извлекает из этого файла данные о сканере в структуру типа 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
Ответы с готовыми решениями:

Программа просит "функция должна возвращать значения"
Программа просит "функция должна возвращать значения" #include "pch.h" #include <iostream>...

Ошибка "функция должна возвращать значение"
Всем привет! Возникает непонятная ошибка с которой не могу справиться. Функция читает данные...

Выведите "YES", если бабочка с данным номером содержится в коллекции, и "NO" - в противном случае...
Как известно, Андрй Сергеевич - ярый коллекционер бабочек. Он имеет огромную коллекцию, экспонаты...

Вывести "Да", если число трёхзначное, и "Нет" - в противном случае
Написать программу, которая вводит целое число и выводит Да, если оно трёхзначное и Нет в противном...

7
Эксперт С++
5052 / 3113 / 271
Регистрация: 11.11.2009
Сообщений: 7,045
03.02.2011, 22:34 2
1) Да, подозреваю, именно проверка на открытие файла.
2) Мы можем проверять, правильно ли отработала функция, т.е. заполнила ли она output_item, и можем ли мы эти данные в дальнейшем использовать. В случае неудачи, мы, например, можем предоставить пользователю выбор, попробовать ли считать данные ещё раз или завершить программу.
1
Эксперт С++
5826 / 3477 / 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
Эксперт С++
5826 / 3477 / 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
Эксперт С++
5826 / 3477 / 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
06.02.2011, 15:18
Помогаю со студенческими работами здесь

Ввести слово, вывести "ДА" если первый и последний символ совпадает, в противном случае вывести "НЕТ"
Ввести слово, вывести &quot;ДА&quot; если первый и последний символ совпадает, в противном случае вывести...

Вывести "Leap Year", если заданный год високосный и "Normal Year" в противном случае
2.На вход программы подается год. Надо вывести слова Leap Year, если этот год високосный и Normal...

Вывести на экран "да", если числа имеют одинаковые знаки, в противном случае вывести "нет"
2.Даны действительные числа a и b. Вывести на экран &quot;да&quot;, если эти числа имеют одинаковые знаки, в...

Если вторая цифра в числе равна 2, то напечатать "Да", в противном случае напечатать "Нет"
Дано целое четырехзначный число Х. Если вторая цифра в том числе есть 2, то напечатать &quot;Да&quot;, в...

Компилятор пишет "func должна возвращать значение": как исправить ошибку?
Пишет &quot;func должна возвращать значение&quot;, что надо сделать? #include &quot;stdafx.h&quot; #include...

Ошибка "operator[]: должна возвращать значение"
Добрый вечер, по условию был составлен код: Создать класс карта, имеющая ранг и масть. Карту...


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

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

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