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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 5.00
_Elena_
0 / 0 / 0
Регистрация: 09.07.2011
Сообщений: 11
#1

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

09.07.2011, 17:37. Просмотров 1534. Ответов 31
Метки нет (Все метки)

по заданному списку фамилий напечатать каждому упомянутому в списке поздравление к определенному празднику. чтобы избежать шаблона, перечень желаемых благ выбирать как случайное подмножество из заготовленного списка. для универсальности программы можно сделать переменным и название праздника

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++ Есть готовый код C++ (Code Composer Studio). Копирование матрицы. Как исправить ошибки?
нужно найти ошибки в задаче на языке C/ их в районе 10 как выдает компилятор но я не могу их исправить (не знаю как) C++
подскажите как исправить ошибки в коде C++(oop) C++
C++ Не знаю как исправить ошыбку в коде
Не знаю как исправить ошыбку в коде C++
C++ в коде ниже есть ошибки. в чем они и как их устранить?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
kravam
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,394
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
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,394
10.07.2011, 15:08     пример на файлы. у меня в коде есть ошибки, но я не знаю, как их исправить #23
Проще, уж будь спокойна.
C++
1
gets (m[0]);
Посмори в справочнике что делает эта функция; длина имени должна быть не более 29 символов. Всё!
grizlik78
Эксперт С++
1903 / 1435 / 109
Регистрация: 29.05.2011
Сообщений: 2,989
10.07.2011, 15:40     пример на файлы. у меня в коде есть ошибки, но я не знаю, как их исправить #24
Цитата Сообщение от kravam Посмотреть сообщение
Посмори в справочнике что делает эта функция; длина имени должна быть не более 29 символов. Всё!
А поскольку пользователи никогда документацию не читают, то чтобы программа не падала нужно использовать функции, не позволяющие испортить чужую память.
C
1
fgets (m[0], 30, stdin);
kravam
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,394
10.07.2011, 15:58     пример на файлы. у меня в коде есть ошибки, но я не знаю, как их исправить #25
Я в Елену верю.
А вообще просто пусть следит за тем, чтобы фамилия была не больше 29 символов. Если зевнёт, то в моём случае пропишется память, в твоём будет направильная фамилия. Хрен редьки не слаще.
grizlik78
Эксперт С++
1903 / 1435 / 109
Регистрация: 29.05.2011
Сообщений: 2,989
10.07.2011, 16:18     пример на файлы. у меня в коде есть ошибки, но я не знаю, как их исправить #26
Немного слаще. Если строка урезалась при вводе, то это можно попытаться определить, хотя это и не просто совсем. Если программа упала (в лучшем случае) или начала страшно глючить из-за испорченных данных, то сделать уже ничего нельзя.
Для учебных программ это, может, и не важно, а может и важно, так как лучше изначально приучать себя не допускать переполнения буфера.
easybudda
Эксперт С++
9439 / 5462 / 925
Регистрация: 25.07.2009
Сообщений: 10,481
10.07.2011, 16:23     пример на файлы. у меня в коде есть ошибки, но я не знаю, как их исправить #27
Цитата Сообщение от grizlik78 Посмотреть сообщение
А поскольку пользователи никогда документацию не читают
напомню, что
Цитата Сообщение от grizlik78 Посмотреть сообщение
C
1
fgets (m[0], 30, stdin);
занесёт в строку и символ '\n', и этот момент лучше сразу учесть, чтобы потом не удивляться...
kravam
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,394
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
Эксперт С++
1903 / 1435 / 109
Регистрация: 29.05.2011
Сообщений: 2,989
10.07.2011, 18:04     пример на файлы. у меня в коде есть ошибки, но я не знаю, как их исправить #29
Цитата Сообщение от kravam Посмотреть сообщение
Нужно изначально приучать себя не допускать переполнения буфера, а потому отслеживать длину строки вручную.
Привет.
Привет-привет. Речь-то шла про gets, которая принципиально не позволяет предотвратить переполнение буфера. И в любом нормальном источнике если упоминают эту функцию, то тут же рекомендуют не пользоваться ею никогда-никогда.

Цитата Сообщение от kravam Посмотреть сообщение
Нехорошо говорить слова
Ась? По-моему, говорить слова — очень хорошо
kravam
быдлокодер
1690 / 877 / 44
Регистрация: 04.06.2008
Сообщений: 5,394
10.07.2011, 18:08     пример на файлы. у меня в коде есть ошибки, но я не знаю, как их исправить #30
Цитата Сообщение от grizlik78 Посмотреть сообщение
И в любом нормальном источнике если упоминают эту функцию, то тут же рекомендуют не пользоваться ею никогда-никогда.
Естессно, кто ж сомневался бы, что ты нормальными источниками, пользуешься, а я нет?
easybudda
Эксперт С++
9439 / 5462 / 925
Регистрация: 25.07.2009
Сообщений: 10,481
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++ Класс string " ошибки, не знаю как исправить
C++ Найти причины возникновения ошибок в коде и исправить эти ошибки (динамический массив как поле класса)
Исправить ошибки в коде C++

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

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

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