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

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

Восстановить пароль Регистрация
 
eL'f
0 / 0 / 0
Регистрация: 04.11.2010
Сообщений: 6
20.12.2011, 23:40     консольное приложение.запись в файл, некорректный вывод содержимого файла. #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
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;
}
буду благодарна любой подсказке.спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
20.12.2011, 23:40     консольное приложение.запись в файл, некорректный вывод содержимого файла.
Посмотрите здесь:

Вывод содержимого файла по символьно C++
Некорректный вывод содержимого из файла C++
C++ Создать очередь из файла, совершение операций надо очередью(удаление элемента, добавление, запись в файл, вывод)
Запись содержимого объекта в файл C++
Вывод содержимого файла C++
C++ Некорректный вывод в файл
Некорректный вывод в файл C++
C++ Поиск и обработка файла (консольное приложение)

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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