Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

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

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

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

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

Не знаю как исправить ошыбку в коде - C++
Выбивает вот-это error C2679: бинарный &quot;=&quot;: не найден оператор, принимающий правый операнд типа &quot;flower (__cdecl *)(void)&quot; (или приемлемое...

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

Не знаю как переделать лабу, есть пример - C++
Есть готовая лаба, нужно переделать под другой вариан Помогите, пожалуйста..... Порядок выполнения работы. 1. Выбрать класс АТД в...

Класс string " ошибки, не знаю как исправить - C++
компилятор ругает &quot;{&quot; в конструкторах, что нужно поправить или как заменить эти конструкторы? мой код: TPString.h #ifndef TPSTR_H ...

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

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

31
_Elena_
0 / 0 / 0
Регистрация: 09.07.2011
Сообщений: 11
10.07.2011, 14:04  [ТС] #16
у меня спецификация %с и так стояла
C
1
2
3
4
for(i=0;i<kol;i++){
        fprintf(d,"%c","\n");
        for(j=0;j<19;j++)
                fprintf(d,"%c",m[i][j]);}
мне тогда для фамилии и названия праздника отдельные циклы делать? или нет?
0
grizlik78
Эксперт С++
1971 / 1464 / 122
Регистрация: 29.05.2011
Сообщений: 3,029
10.07.2011, 14:10 #17
Цитата Сообщение от _Elena_ Посмотреть сообщение
C
1
fprintf(d,"%c","\n");
Это неправильная форма в любом случае. Одиночный символ заключается в одинарные кавычки, т.е.
C
1
fprintf(d,"%c",'\n');
Но поскольку символ известен заранее, то и вовсе не надо его отдельно передавать, а можно прямо в форматную строку и засунуть
C
1
fprintf(d,"\n");
но здесь уже двойные кавычки, так-как строка формата — это именно строка, хоть и из одного символа.

Добавлено через 3 минуты
Цитата Сообщение от _Elena_ Посмотреть сообщение
мне тогда для фамилии и названия праздника отдельные циклы делать? или нет?
Вообще, если использовать строки, оканчивающиеся нулём (обычные для C строки), то ни для ввода, ни для вывода циклы не потребуются. Нужен будет спецификатор %s, но, разумеется, правильно используемый.
Если же выводить массивы посимвольно, то либо хранить отдельно количество актуальных символов, либо неиспользуемые символы заполнять пробелами.
1
_Elena_
0 / 0 / 0
Регистрация: 09.07.2011
Сообщений: 11
10.07.2011, 14:12  [ТС] #18
Цитата Сообщение от grizlik78 Посмотреть сообщение
Вообще, если использовать строки, оканчивающиеся нулём (обычные для C строки), то ни для ввода, ни для вывода циклы не потребуются. Нужен будет спецификатор %s, но, разумеется, правильно используемый.
Если же выводить массивы посимвольно, то либо хранить отдельно количество актуальных символов, либо неиспользуемые символы заполнять пробелами.
большое спасибо)
0
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
10.07.2011, 14:29 #19
ОК, тогда поехали разбираться.
Вообще как было уже сказано, нужно другие функции использовать. Ту же gets, куда уж удобнее! Но я бы на твоё м месте добил пример с использованием scanf, да бы в памяти отложилось. Потом бы я тебе показал, как сделать это проще, на С. Короче, ошибки памяти.
/////////////////////////////////////////////////////////
Давай так: Я вижу
C++
1
2
3
printf("_Vvedite familiu\n");
for(j=0;j<7;j++)
        scanf("%c",&m[0][j]);
ЭТот код хорошо в одном-единственном случае- если у тебя фамилия из шести символов, понимаешь? Если будет фамилия Sidorova, то она просто не введётся! И в лучшем случае подравлять будут мужика Сидорова, а не женщину. Так, а если фамилия Кац, то всё, приехали, ты ввела "Кац", а машина ПРОДОЛЖАЕТ ждать ввода. Что скажешь на это? Или уславлиаемся, что фамилия будет состоять СТРОГО из 6-ти символов (что плохо) или пытаемся исправить. ВЫбирай.
0
_Elena_
0 / 0 / 0
Регистрация: 09.07.2011
Сообщений: 11
10.07.2011, 14:33  [ТС] #20
я писала код под тот список, который указан в файле, поэтому j<7.
код подправила немного и все работает как надо.
а если исправлять, то как?
0
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
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
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
10.07.2011, 15:08 #23
Проще, уж будь спокойна.
C++
1
gets (m[0]);
Посмори в справочнике что делает эта функция; длина имени должна быть не более 29 символов. Всё!
1
grizlik78
Эксперт С++
1971 / 1464 / 122
Регистрация: 29.05.2011
Сообщений: 3,029
10.07.2011, 15:40 #24
Цитата Сообщение от kravam Посмотреть сообщение
Посмори в справочнике что делает эта функция; длина имени должна быть не более 29 символов. Всё!
А поскольку пользователи никогда документацию не читают, то чтобы программа не падала нужно использовать функции, не позволяющие испортить чужую память.
C
1
fgets (m[0], 30, stdin);
1
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
10.07.2011, 15:58 #25
Я в Елену верю.
А вообще просто пусть следит за тем, чтобы фамилия была не больше 29 символов. Если зевнёт, то в моём случае пропишется память, в твоём будет направильная фамилия. Хрен редьки не слаще.
0
grizlik78
Эксперт С++
1971 / 1464 / 122
Регистрация: 29.05.2011
Сообщений: 3,029
10.07.2011, 16:18 #26
Немного слаще. Если строка урезалась при вводе, то это можно попытаться определить, хотя это и не просто совсем. Если программа упала (в лучшем случае) или начала страшно глючить из-за испорченных данных, то сделать уже ничего нельзя.
Для учебных программ это, может, и не важно, а может и важно, так как лучше изначально приучать себя не допускать переполнения буфера.
0
easybudda
Модератор
Эксперт CЭксперт С++
9698 / 5648 / 964
Регистрация: 25.07.2009
Сообщений: 10,863
10.07.2011, 16:23 #27
Цитата Сообщение от grizlik78 Посмотреть сообщение
А поскольку пользователи никогда документацию не читают
напомню, что
Цитата Сообщение от grizlik78 Посмотреть сообщение
C
1
fgets (m[0], 30, stdin);
занесёт в строку и символ '\n', и этот момент лучше сразу учесть, чтобы потом не удивляться...
1
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
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
Эксперт С++
1971 / 1464 / 122
Регистрация: 29.05.2011
Сообщений: 3,029
10.07.2011, 18:04 #29
Цитата Сообщение от kravam Посмотреть сообщение
Нужно изначально приучать себя не допускать переполнения буфера, а потому отслеживать длину строки вручную.
Привет.
Привет-привет. Речь-то шла про gets, которая принципиально не позволяет предотвратить переполнение буфера. И в любом нормальном источнике если упоминают эту функцию, то тут же рекомендуют не пользоваться ею никогда-никогда.

Цитата Сообщение от kravam Посмотреть сообщение
Нехорошо говорить слова
Ась? По-моему, говорить слова — очень хорошо
0
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489
10.07.2011, 18:08 #30
Цитата Сообщение от grizlik78 Посмотреть сообщение
И в любом нормальном источнике если упоминают эту функцию, то тут же рекомендуют не пользоваться ею никогда-никогда.
Естессно, кто ж сомневался бы, что ты нормальными источниками, пользуешься, а я нет?
0
10.07.2011, 18:08
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2011, 18:08
Привет! Вот еще темы с ответами:

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

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

Найти ошибки в коде и исправить эти ошибки (Наследование) - C++
Вот в общем 3 файла, изучаю наследование на примере односвязного и двусвязного списков: list.h (inline) #pragma once class list...

Найти ошибки в коде и исправить эти ошибки - C++ - C++
Судя по вываливающейся ошибки, идет двойное освобождение памяти. У самого не получается отловить откуда. A.h #pragma once ...


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

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

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