Форум программистов, компьютерный форум CyberForum.ru

пример на файлы. у меня в коде есть ошибки, но я не знаю, как их исправить - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
_Elena_
0 / 0 / 0
Регистрация: 09.07.2011
Сообщений: 11
09.07.2011, 17:37     пример на файлы. у меня в коде есть ошибки, но я не знаю, как их исправить #1
по заданному списку фамилий напечатать каждому упомянутому в списке поздравление к определенному празднику. чтобы избежать шаблона, перечень желаемых благ выбирать как случайное подмножество из заготовленного списка. для универсальности программы можно сделать переменным и название праздника

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
#include <stdafx.h>
#include <conio.h>
#include <stdio.h>
#include <iostream>
#include <math.h>
#include <string.h>
 
#define  file_imya "imena.txt"
#define  file_prazd "prazd.txt"
#define  file_pozdr "pozdr.txt"
#define  file_otvet "otvet.txt"
 
void main(void)
{
system("cls");
FILE *a, *b, *c, *d;
char m[4][30], stroka[3];
char h[30],f[30],g[30];
int i,j,kol,n;
 
if((a=fopen(file_imya,"r"))==NULL) 
    printf("Oshibka pri otkrytii faila %c.\n",file_imya);
 
if((b=fopen(file_prazd,"r"))==NULL) 
    printf("Oshibka pri otkrytii faila %c.\n",file_prazd);
 
if((c=fopen(file_pozdr,"r"))==NULL) 
    printf("Oshibka pri otkrytii faila %c.\n",file_pozdr);
 
if((d=fopen(file_otvet,"w"))==NULL) 
    printf("Oshibka pri otkrytii faila %c.\n",file_otvet);                                        
                                                                                                  
for(i=0; fscanf(a,"%c",&h[i])!= EOF; i++)
    printf("%c",h[i]);
    
printf("Vvedite familiu\n");
scanf("%c",&m[0][j]);
 
 
for(i=0; fscanf(b,"%c",&f[i])!= EOF; i++)
    printf("%c",f[i]);
 
printf("Vvedite prazdnik\n");
scanf("%c",&m[1][j]);
 
 
for(i=0; fscanf(c,"%c",&g[i])!= EOF; i++)
    printf("%c",g[i]);
 
printf("Vvedite pozdravlenie\n");
scanf("%c",&m[2][j]);
 
 
kol=3;
for(i=0;i<kol;i++){
    fprintf(d,"%c","\n");
    for(j=0;j<n;j++)
        fprintf(d,"%c",m[i][j]);}
 
printf("Rasultat zapisan v faile otvet.txt\n");
 
fclose(a);
fclose(b);
fclose(c);
fclose(d);
getch();    
    return 0;
}
помогите, пожалуйста

 Комментарий модератора 
Используйте теги форматирования кода!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.07.2011, 17:37     пример на файлы. у меня в коде есть ошибки, но я не знаю, как их исправить
Посмотрите здесь:

Не знаю как переделать лабу, есть пример C++
нужно найти ошибки в задаче на языке C/ их в районе 10 как выдает компилятор но я не могу их исправить (не знаю как) C++
подскажите как исправить ошибки в коде C++(oop) C++
C++ Не знаю как исправить ошыбку в коде
Не знаю как исправить ошыбку в коде C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
10.07.2011, 14:54     пример на файлы. у меня в коде есть ошибки, но я не знаю, как их исправить #21
А тогда вот так. У тебя под фамилию отведено 30 байт (зачем тогда устанавливать ограничение 7?), ок, пусть будет 30, (но не больше!)

Сперва посмотри на цикл. В нём ты проверяешь, не был ли введён символ новой строки? И если не был, то ввод продолжается
C++
1
2
for(;&m[0][j- 1]!= 10;j++)
        scanf("%c",&m[0][j]);
Хорошо? Вроде бы. Но как быть с самым первым (нулевым) введённым сиволом? Нам придётся проверить символ m [0] [-1], а его просто нет!
А тогда нулевой символ вводим БЕЗ ПРОВЕРКИ. То есть просто так:
C++
1
scanf("%c",&m[0][j]);
Ок, соединяем два кода в один получаем:
C++
1
2
3
4
printf("_Vvedite familiu но не более чм из 29 символов\n");
scanf("%c",&m[0][j]);
for(j++;&m[0][j- 1]!= 10;j++)
        scanf("%c",&m[0][j]);
Вот смело вводи 29 символов, всё будет нормально. Да не совсем.
Дело в том, что после фамилии ты должна поставить ноль. Последний штрих:

C++
1
2
3
4
5
printf("_Vvedite familiu но не более чм из 29 символов\n");
scanf("%c",&m[0][j++]);
for(;&m[0][j- 1]!= 10;j++)
        scanf("%c",&m[0][j]);
&m[0][j- 1]= 0;
Всё, смело вводи фамилию из 29-символов или меньше, она корректна будет в строке. Это громоздко, но это исправленный ТВОЙ код. Потом могу показать как проще сделать.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
_Elena_
0 / 0 / 0
Регистрация: 09.07.2011
Сообщений: 11
10.07.2011, 15:02  [ТС]     пример на файлы. у меня в коде есть ошибки, но я не знаю, как их исправить #22
благодарю а насколько проще получится?
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
10.07.2011, 15:08     пример на файлы. у меня в коде есть ошибки, но я не знаю, как их исправить #23
Проще, уж будь спокойна.
C++
1
gets (m[0]);
Посмори в справочнике что делает эта функция; длина имени должна быть не более 29 символов. Всё!
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
10.07.2011, 15:40     пример на файлы. у меня в коде есть ошибки, но я не знаю, как их исправить #24
Цитата Сообщение от kravam Посмотреть сообщение
Посмори в справочнике что делает эта функция; длина имени должна быть не более 29 символов. Всё!
А поскольку пользователи никогда документацию не читают, то чтобы программа не падала нужно использовать функции, не позволяющие испортить чужую память.
C
1
fgets (m[0], 30, stdin);
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
10.07.2011, 15:58     пример на файлы. у меня в коде есть ошибки, но я не знаю, как их исправить #25
Я в Елену верю.
А вообще просто пусть следит за тем, чтобы фамилия была не больше 29 символов. Если зевнёт, то в моём случае пропишется память, в твоём будет направильная фамилия. Хрен редьки не слаще.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
10.07.2011, 16:18     пример на файлы. у меня в коде есть ошибки, но я не знаю, как их исправить #26
Немного слаще. Если строка урезалась при вводе, то это можно попытаться определить, хотя это и не просто совсем. Если программа упала (в лучшем случае) или начала страшно глючить из-за испорченных данных, то сделать уже ничего нельзя.
Для учебных программ это, может, и не важно, а может и важно, так как лучше изначально приучать себя не допускать переполнения буфера.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
10.07.2011, 16:23     пример на файлы. у меня в коде есть ошибки, но я не знаю, как их исправить #27
Цитата Сообщение от grizlik78 Посмотреть сообщение
А поскольку пользователи никогда документацию не читают
напомню, что
Цитата Сообщение от grizlik78 Посмотреть сообщение
C
1
fgets (m[0], 30, stdin);
занесёт в строку и символ '\n', и этот момент лучше сразу учесть, чтобы потом не удивляться...
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
10.07.2011, 17:53     пример на файлы. у меня в коде есть ошибки, но я не знаю, как их исправить #28
Цитата Сообщение от grizlik78 Посмотреть сообщение
Для учебных программ это, может, и не важно, а может и важно, так как лучше изначально приучать себя не допускать переполнения буфера.
Нехорошо говорить слова. Тот же самый аргумент могу привести и я:
Нужно изначально приучать себя не допускать переполнения буфера, а потому отслеживать длину строки вручную.
Привет.

Добавлено через 6 минут
А коль скоро речь идёт о С, тогда так:
C++
1
2
3
4
5
6
7
8
9
10
11
printf("_Vvedite familiu но не более чм из 29 символов\n");
scanf("%c",&m[0][j++]);
for(;&m[0][j- 1]!= 10;j++) {
 scanf("%c",&m[0][j]);
 if (j==29 && m[0][j]!= 10) {
  printf("Перебор, вводи по новой \n");
  j= 0;
  scanf("%c",&m[0][j++]);
 }
}
&m[0][j- 1]= 0;
Добавлено через 48 секунд
Это автоматом всё отслеживается.
grizlik78
Эксперт C++
 Аватар для grizlik78
1882 / 1414 / 101
Регистрация: 29.05.2011
Сообщений: 2,958
10.07.2011, 18:04     пример на файлы. у меня в коде есть ошибки, но я не знаю, как их исправить #29
Цитата Сообщение от kravam Посмотреть сообщение
Нужно изначально приучать себя не допускать переполнения буфера, а потому отслеживать длину строки вручную.
Привет.
Привет-привет. Речь-то шла про gets, которая принципиально не позволяет предотвратить переполнение буфера. И в любом нормальном источнике если упоминают эту функцию, то тут же рекомендуют не пользоваться ею никогда-никогда.

Цитата Сообщение от kravam Посмотреть сообщение
Нехорошо говорить слова
Ась? По-моему, говорить слова — очень хорошо
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
10.07.2011, 18:08     пример на файлы. у меня в коде есть ошибки, но я не знаю, как их исправить #30
Цитата Сообщение от grizlik78 Посмотреть сообщение
И в любом нормальном источнике если упоминают эту функцию, то тут же рекомендуют не пользоваться ею никогда-никогда.
Естессно, кто ж сомневался бы, что ты нормальными источниками, пользуешься, а я нет?
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
10.07.2011, 18:34     пример на файлы. у меня в коде есть ошибки, но я не знаю, как их исправить #31
kravam,
SECURITY CONSIDERATIONS
The gets() function cannot be used securely. Because of its lack of
bounds checking, and the inability for the calling program to reliably
determine the length of the next incoming line, the use of this function
enables malicious users to arbitrarily change a running program's func-
tionality through a buffer overflow attack. It is strongly suggested
that the fgets() function be used in all cases. (See the FSA.)
нормальный источник
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2011, 18:37     пример на файлы. у меня в коде есть ошибки, но я не знаю, как их исправить
Еще ссылки по теме:

C++ в коде ниже есть ошибки. в чем они и как их устранить?
C++ Как исправить ошибки в коде
Исправить ошибки в коде или пояснить как правильно запустить C++

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

Или воспользуйтесь поиском по форуму:
kravam
быдлокодер
 Аватар для kravam
1512 / 872 / 44
Регистрация: 04.06.2008
Сообщений: 5,271
10.07.2011, 18:37     пример на файлы. у меня в коде есть ошибки, но я не знаю, как их исправить #32
несерьёзно
Yandex
Объявления
10.07.2011, 18:37     пример на файлы. у меня в коде есть ошибки, но я не знаю, как их исправить
Ответ Создать тему
Опции темы

Текущее время: 09:14. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru