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

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

09.07.2011, 17:37. Просмотров 1698. Ответов 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;
}
помогите, пожалуйста

 Комментарий модератора 
Используйте теги форматирования кода!

http://www.cyberforum.ru/cpp-beginners/thread986954.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.07.2011, 17:37
Я подобрал для вас темы с готовыми решениями и ответами на вопрос пример на файлы. у меня в коде есть ошибки, но я не знаю, как их исправить (C++):

Не знаю как исправить ошыбку в коде
Ошыбка, наверное, в том что я в классе roslunu описываю ф-ию get_name, где...

Не знаю как переделать лабу, есть пример
Есть готовая лаба, нужно переделать под другой вариан Помогите,...

Класс string " ошибки, не знаю как исправить
компилятор ругает &quot;{&quot; в конструкторах, что нужно поправить или как заменить эти...

нужно найти ошибки в задаче на языке C/ их в районе 10 как выдает компилятор но я не могу их исправить (не знаю как)
#include &lt;math.h&gt; #include &lt;conio.h&gt; #include &lt;stdio.h&gt; void main() { int...

Как исправить ошибки в коде
Не могу понять что не так. Помогите пожалуйста. #include &lt;iostream&gt; #include...

31
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
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-символов или меньше, она корректна будет в строке. Это громоздко, но это исправленный ТВОЙ код. Потом могу показать как проще сделать.
0
_Elena_
0 / 0 / 0
Регистрация: 09.07.2011
Сообщений: 11
10.07.2011, 15:02  [ТС] #22
благодарю а насколько проще получится?
0
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
10.07.2011, 15:08 #23
Проще, уж будь спокойна.
C++
1
gets (m[0]);
Посмори в справочнике что делает эта функция; длина имени должна быть не более 29 символов. Всё!
1
grizlik78
Эксперт С++
1983 / 1476 / 191
Регистрация: 29.05.2011
Сообщений: 3,048
10.07.2011, 15:40 #24
Цитата Сообщение от kravam Посмотреть сообщение
Посмори в справочнике что делает эта функция; длина имени должна быть не более 29 символов. Всё!
А поскольку пользователи никогда документацию не читают, то чтобы программа не падала нужно использовать функции, не позволяющие испортить чужую память.
C
1
fgets (m[0], 30, stdin);
1
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
10.07.2011, 15:58 #25
Я в Елену верю.
А вообще просто пусть следит за тем, чтобы фамилия была не больше 29 символов. Если зевнёт, то в моём случае пропишется память, в твоём будет направильная фамилия. Хрен редьки не слаще.
0
grizlik78
Эксперт С++
1983 / 1476 / 191
Регистрация: 29.05.2011
Сообщений: 3,048
10.07.2011, 16:18 #26
Немного слаще. Если строка урезалась при вводе, то это можно попытаться определить, хотя это и не просто совсем. Если программа упала (в лучшем случае) или начала страшно глючить из-за испорченных данных, то сделать уже ничего нельзя.
Для учебных программ это, может, и не важно, а может и важно, так как лучше изначально приучать себя не допускать переполнения буфера.
0
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,230
10.07.2011, 16:23 #27
Цитата Сообщение от grizlik78 Посмотреть сообщение
А поскольку пользователи никогда документацию не читают
напомню, что
Цитата Сообщение от grizlik78 Посмотреть сообщение
C
1
fgets (m[0], 30, stdin);
занесёт в строку и символ '\n', и этот момент лучше сразу учесть, чтобы потом не удивляться...
1
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
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 секунд
Это автоматом всё отслеживается.
0
grizlik78
Эксперт С++
1983 / 1476 / 191
Регистрация: 29.05.2011
Сообщений: 3,048
10.07.2011, 18:04 #29
Цитата Сообщение от kravam Посмотреть сообщение
Нужно изначально приучать себя не допускать переполнения буфера, а потому отслеживать длину строки вручную.
Привет.
Привет-привет. Речь-то шла про gets, которая принципиально не позволяет предотвратить переполнение буфера. И в любом нормальном источнике если упоминают эту функцию, то тут же рекомендуют не пользоваться ею никогда-никогда.

Цитата Сообщение от kravam Посмотреть сообщение
Нехорошо говорить слова
Ась? По-моему, говорить слова — очень хорошо
0
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
10.07.2011, 18:08 #30
Цитата Сообщение от grizlik78 Посмотреть сообщение
И в любом нормальном источнике если упоминают эту функцию, то тут же рекомендуют не пользоваться ею никогда-никогда.
Естессно, кто ж сомневался бы, что ты нормальными источниками, пользуешься, а я нет?
0
easybudda
Модератор
Эксперт CЭксперт С++
10021 / 5944 / 1483
Регистрация: 25.07.2009
Сообщений: 11,230
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.)
нормальный источник
1
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
10.07.2011, 18:37 #32
несерьёзно
0
10.07.2011, 18:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2011, 18:37
Привет! Вот еще темы с решениями:

подскажите как исправить ошибки в коде C++(oop)
Программа реализует класс &quot;треугольник&quot; и всевозможные методы для него...

Исправить ошибки в коде или пояснить как правильно запустить
Добрый вечер,нужна помощь есть текст программы написанный в 2010 с++ ,немогу...

Найти ошибки в коде и исправить эти ошибки (Наследование)
Вот в общем 3 файла, изучаю наследование на примере односвязного и двусвязного...

у меня ошибки не могу их исправить
#include &quot;Header.h&quot; movie::movie() { name = &quot; &quot;; info = &quot; &quot;; length =...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru