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

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

Войти
Регистрация
Восстановить пароль
 
eL'f
0 / 0 / 0
Регистрация: 04.11.2010
Сообщений: 6
#1

консольное приложение.запись в файл, некорректный вывод содержимого файла. - C++

20.12.2011, 23:40. Просмотров 937. Ответов 0
Метки нет (Все метки)

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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
#include "stdafx.h"
#include "string.h"
#include "locale.h"
#include "conio.h"
//Определение структуры данных - канцелярских товаров       
struct TOfficeEquip
{   
    char* kind; 
    float dlinaK;
    float plS;
};
//Функция для безопасного ввода строк символов с клавиатуры
char* SafeKeybInput(unsigned* StrLength)
{
    bool again=true;
    char str[30],*pstr=str;    
    char buf[80],*pbuf=buf;
    //Инициализируем максимальную длину буфера
    buf[0]=30;
    while (again)
    {
        pbuf=cgets(buf);
        *StrLength=buf[1];
        //Если что-нибудь введено с клавиатуры, то...
        if (*StrLength)
        {   
            //копируем содержимое буфера в переменную...
            strcpy(str,pbuf);
            //и выходим из цикла
            again=false;
        }       
    }
    return pstr;
}
//Функция для разбора строки
float StrToPlS(char *Str, char *pTempKind, unsigned* pKindLength)
{   
    //Объявление символа \0 - конца строки
    char Nul='\0';
    char TempPlS[30],*pTempPlS=TempPlS;     
    float plS;
    char TempDlinaK[30],*pTempDlinaK=TempDlinaK;
    float dlinaK;
    *pKindLength=0;
 
    //Пока не найден символ-разделитель...
    while (*Str!='|')
        //переписываем посимвольно строку
    {   
        *pTempKind++=*Str++;
        *pKindLength++;
    }
    //Добавляем символ конца строки
    *pTempKind++=Nul;   
    *Str++;
 
        //Пока не найден символ \10...
    while ((*Str!=10)&&(*Str!=0))
    
        *pTempDlinaK++=*Str++;
        *pTempDlinaK++=Nul;
    
        //Преобразуем строку в число типа float
    sscanf(TempDlinaK,"%f",&dlinaK);
    
    return dlinaK;
    
        //Пока не найден символ \10...
    while ((*Str!=10)&&(*Str!=0))
        //переписываем посимвольно строку
    
        *pTempPlS++=*Str++;
        *pTempPlS++=Nul;
    
    //Преобразуем строку в число типа float
    sscanf(TempPlS,"%f",&plS);
    return plS;
    
};
//Процедура для вывода данных в виде таблицы
void ArrayPrint(TOfficeEquip *MasTools, int NumTools)
{
    int i,j;
    printf("\n");
    printf("\n Наименование                    | Длина контура            | Площадь");
    printf("\n --------------------------------------------------------------------");
    for(i=1; i<=NumTools; i++)
    {
        printf("\n %s", MasTools[i].kind);
        for (j=0;j<(32-strlen(MasTools[i].kind));j++)
            printf(" ");
        printf("| %5.2f", MasTools[i].dlinaK);
        printf("                    | %5.2f", MasTools[i].plS);
    }
    printf("\n\n\n\n");
};
 
 
//Функция для ввода данных структуры
int DataInput(TOfficeEquip *MasTools)
{
    int i, SafeProp;
    int NumTools;
    unsigned *pStrLength;
    char *ptoolinf, *ptemptool;
    //Вводим количество записей в структуре для ввода с клавиатуры
    printf("Введите количество графических фигур: ");
    //Проверка правильности ввода числа
    SafeProp=scanf("%d",&NumTools);
    if (SafeProp==1)
        if (NumTools<0)
            SafeProp=0;
    //Если число введено с ошибкой, то...
    while (SafeProp==0)
        {       
            //просим пользователя повторить ввод
            printf(" Введите корректное число!!!");     
            printf("\n Повторите ввод: ");
            //Очистка буфера ввода
            fflush(stdin);
            SafeProp=scanf("%d",&NumTools);
            if (SafeProp==1)
                if (NumTools<0)
                    SafeProp=0;
        }   
    //Ввод информации в структуру данных
    for(i=1;i<=NumTools;i++)
    {       
        printf("\n Введите информацию о графической фигуре:",i);
        printf("\n Введите название фигуры: ");
        //Выделяем память для динамических переменных
        pStrLength=new unsigned;
        ptemptool=new char[30];     
        //Вызов функции безопасного ввода
        ptoolinf=SafeKeybInput(pStrLength);     
        strcpy(ptemptool,ptoolinf);
        //Выделяем память для поля структуры и записываем в поле информацию
        MasTools[i].kind=new char[*pStrLength+1];
        strcpy(MasTools[i].kind,ptemptool);             
        printf(" Введите длину по контуру: ");
        //Проверка правильности ввода числа
        SafeProp=scanf("%f",&MasTools[i].dlinaK);
        if (SafeProp==1)
            if (MasTools[i].dlinaK<0)
                SafeProp=0;
        //Если число введено с ошибкой, то...
        while (SafeProp==0)
        {       
            //просим пользователя повторить ввод
            printf(" Введите корректное число!!!");     
            printf("\n Повторный ввод: ");
            //Очистка буфера ввода
            fflush(stdin);
            SafeProp=scanf("%f",&MasTools[i].dlinaK);
            if (SafeProp==1)
                if (MasTools[i].dlinaK<0)
                    SafeProp=0;
        }   
        printf(" Введите площадь фигуры: ");
        //Проверка правильности ввода числа
        SafeProp=scanf("%f",&MasTools[i].plS);
        if (SafeProp==1)
            if (MasTools[i].plS<0)
                SafeProp=0;
        //Если число введено с ошибкой, то...
        while (SafeProp==0)
        {       
            //просим пользователя повторить ввод
            printf(" Введите корректное число!!!");     
            printf("\n Повторный ввод: ");
            //Очистка буфера ввода
            fflush(stdin);
            SafeProp=scanf("%f",&MasTools[i].plS);
            if (SafeProp==1)
                if (MasTools[i].plS<0)
                    SafeProp=0;
        }
    }
    return NumTools;
}
//Функция для записи структуры данных в текстовый файл
void DataSave(TOfficeEquip *MasTools, int NumTools)
{
    int i;
    char *pfilename="test.txt";
    FILE *pfile;
    //Открываем текстовый файл для записи
    pfile=fopen(pfilename,"wt");
    //Записываем построчно структуру данных в текстовый файл
    for(i=1;i<=NumTools;i++)    
        fprintf(pfile,"%s|%f|%f\n",MasTools[i].kind,MasTools[i].dlinaK,MasTools[i].plS);
    //Закрываем файл
    fclose(pfile);
}
//Функция для загрузки информации из текстового файла в структуру данных
int DataLoad(TOfficeEquip *MasTools)
{   
    char Kind[30],*pKind=Kind;
    const int length=80;
    char buf[length];
    char *pfilename="test.txt";
    unsigned *KindLength;
 
    FILE *pfile;
    //Если возникла ошибка при открытии файла, то...
    if ((pfile=fopen(pfilename,"rt"))==0)
        //функция возвращает значение -1
        return -1;
    int NumTools=0; 
    //Записываем строку из файла в буферную переменную
    while (fgets(buf,length,pfile))
    {
        //Инкрементируем переменную, содержащую число записей(строк)
        NumTools++;
        //Выделяем память для динамических переменных
        KindLength=new unsigned;
        //Вызов функции разбора строки
        MasTools[NumTools].plS=StrToPlS(buf, pKind, KindLength);
 
        //Выделяем память для полей структуры и записываем в них информацию
        MasTools[NumTools].kind=new char[*KindLength+1];
        strcpy(MasTools[NumTools].kind,pKind);
 
        //Освобождаем память
        delete(KindLength);
    
    }
    //Закрываем файл
    fclose(pfile);
    //Если ошибок нет, то функция возвращает число записей в структуре
    return NumTools;
}
//Главная функция (меню программы)
void _tmain(int argc, _TCHAR* argv[])
{   
    setlocale(LC_ALL,"Russian");
    int numtools=0;
    TOfficeEquip tools[100], *ptools=tools; 
    unsigned choose1=1, choose2=0;
    //Реализация меню программы
    while (choose1)
    {   
        printf("\n 0. Выход"
               "\n 1. Ввод данных"
               "\n 2. Запись в файл"
               "\n 3. Вывод содержимого файла \n\n ");
        //Обработка нажатия на клавишу
        choose1=getch()-'0';
        //Выбор пункта меню в зависимости от нажатой клавиши
        switch (choose1)
        {                   
            case 0: break;
            //Ввод информации с клавиатуры в структуру данных
            case 1: numtools=DataInput(ptools);
                    printf("\n\n Содержание: ");
                    ArrayPrint(ptools,numtools);
                    break;
            //Запись информации из структуры данных в текстовый файл 
            case 2: //Запрос подтверждения на запись
                    printf("\n\n  Перезаписать файл? (y/n) ");
                    choose2=getch();
                    if (choose2==121)
                    {   
                        //Если в структуре данных есть информация, то...
                        if (numtools>0) 
                        {   
                            //сохраняем её в текстовый файл
                            DataSave(ptools,numtools);
                            //Вывод на экран подтверждения о записи файла
                            printf("\n Файл test.txt сохранен.\n\n");
                        }
                        else
                            //Иначе выводим сообщение, что структура данных пустая
                            printf("\n Вы должны ввести информацию."
                                   "\n Сохранение файла не возможно.\n\n");                                         }
                    else
                        printf("\nСохранение отменено.\n");
                    break;
            case 3: //Запрос подтверждения на загрузку новых данных
                    printf("\n\n Загрузить файл? (y/n) ");
                    choose2=getch();
                    if (choose2==121)
                    {               
                        //Загрузка данных из текстового файла
                        numtools=DataLoad(ptools);
                        //Если ошибок при загрузке данных из файла не было, то
                        if (numtools!=-1)
                        {
                            //Выводим загруженные данные на экран
                            printf("\n\n Содержание: ");
                            ArrayPrint(ptools,numtools);
                        }
                        else
                            //Иначе выводим сообщение, что загрузка невозможна
                            printf("\n Загрузка файла не возможна!!!\n"
                                   " Файл не найден.\n\n\n");
                    }
                    else
                        printf("\n Загрузка файла отменена.\n");
                    break;
        }
    }   
}
данные записываются в файл, файл сохраняется. все ок. но выводит некорректно.выводит тип, длину контура, и вместо площади повторно длину контура.
ошибка скорее всего здесь:

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
//Функция для загрузки информации из текстового файла в структуру данных
int DataLoad(TOfficeEquip *MasTools)
{   
    char Kind[30],*pKind=Kind;
    const int length=80;
    char buf[length];
    char *pfilename="test.txt";
    unsigned *KindLength;
 
    FILE *pfile;
    //Если возникла ошибка при открытии файла, то...
    if ((pfile=fopen(pfilename,"rt"))==0)
        //функция возвращает значение -1
        return -1;
    int NumTools=0; 
    //Записываем строку из файла в буферную переменную
    while (fgets(buf,length,pfile))
    {
        //Инкрементируем переменную, содержащую число записей(строк)
        NumTools++;
        //Выделяем память для динамических переменных
        KindLength=new unsigned;
        //Вызов функции разбора строки
        MasTools[NumTools].plS=StrToPlS(buf, pKind, KindLength);
 
        //Выделяем память для полей структуры и записываем в них информацию
        MasTools[NumTools].kind=new char[*KindLength+1];
        strcpy(MasTools[NumTools].kind,pKind);
 
        //Освобождаем память
        delete(KindLength);
    
    }
    //Закрываем файл
    fclose(pfile);
    //Если ошибок нет, то функция возвращает число записей в структуре
    return NumTools;
}
буду благодарна любой подсказке.спасибо!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2011, 23:40
Здравствуйте! Я подобрал для вас темы с ответами на вопрос консольное приложение.запись в файл, некорректный вывод содержимого файла. (C++):

Некорректный вывод содержимого из файла - C++
Слова вроде переносит... но на выводе элементов (ну по тексту смотреть, если. Элементы списка....) - криво выводит string str;...

Некорректный вывод в файл - C++
Добрый день. Реализован алгоритм Хаффмана: #include &quot;stdafx.h&quot; using namespace std; class Node { public: int a;...

Некорректный вывод в файл - C++
Добрый день! При выводе таблицы умножения в файл числа выводятся некорректно. Заранее спасибо! #include &lt;iostream&gt; #include...

Некорректный вывод в файл - C++
Здравствуйте. Компилятор находит ошибку, что-то с вводом выводом #include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;fstream&gt; ...

Запись в файл и вывод из файла строк - C++
Есть две функции: одна записывает дисциплину в файл, другая выводит список дисциплин на экран. Проблема в том, что если название дисциплины...

Некорректный вывод матрицы в файл - C++
Добрый день! Возникла такая проблема, во время работы программы при поиске максимального или минимального значения элемента строки матрицы,...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.12.2011, 23:40
Привет! Вот еще темы с ответами:

Поиск и обработка файла (консольное приложение) - C++
Нужно написать программу,которая будет искать файл по адресу и будет делать что-то с ним.Написать нужно консольное приложение. Пример: ...

Запись структуры в файл, чтение из файла и удаление (файловый ввод/вывод) - C++
Добрый вечер! Возникла такая проблема, что при добавлении записи, удаляются уже имеющиеся записи в файле. Также не помешала бы помощь в...

Запись в файл содержимого консоли - C++
int main (int argc, LPTSTR argv) { cout&lt;&lt;argv&lt;&lt;endl&lt;&lt;argv ; HANDLE hIn, hOut; hIn=CreateFile (argv , GENERIC_READ, 0, NULL,...

Запись содержимого объекта в файл - C++
Привет всем, 1-й раз столкнулся с файлами и сразу проблема :) Как записать поля класса в файл ( хочу сделать что то типа базы, что бы...


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

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

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