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

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

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Дан символ и строка, удвоить каждое вхождение символов в строку http://www.cyberforum.ru/cpp-beginners/thread413149.html
Дан символ и строка, удвоить каждое вхождение символов в строку! кто может помочь?) помогите пожалуйста!
C++ файлы Получить списки студентов заданной группы, пропустивших занятия отдельно по уважительной и неуважительной причинам с указанием часов пропуска. Добавлено через 7 минут #include <iostream> #include "stdio.h" #include"iomanip" #include <string.h> using namespace std; struct data{ char name; http://www.cyberforum.ru/cpp-beginners/thread413148.html
C++ Построить таблицу значений функции z=sh*(x+y)-sh*(x-2y)/sh*sh*(x-y)
Построить таблицу значений функции z=sh*(x+y)-sh*(x-2y)/sh*sh*(x-y) , где x меняется от 1 до 2 с шагом 0,2; y меняется от 2 до 3 с шагом 0,1. Вычисление
Найти количество первых целых положительных чисел, сумма которых не превышает S. Значение S вводить с клавиатуры. C++
Найти количество первых целых положительных чисел, сумма которых не превышает S. Значение S вводить с клавиатуры.
C++ Вводить с клавиатуры целые числа (>0) и выводить на экран квадраты этих чисел до тех пор, пока не будет введено число 0. Использовать цикл do...while. http://www.cyberforum.ru/cpp-beginners/thread413126.html
Вводить с клавиатуры целые числа (>0) и выводить на экран квадраты этих чисел до тех пор, пока не будет введено число 0. Использовать цикл do...while.
C++ Сформировать одномерный динамический массив порядка N, элементы которого имеют указанную ниже структуру... Сформировать одномерный динамический массив порядка N, элементы которого имеют указанную ниже структуру, и организовать обработку его данных. Примечание: для связанных данных, которые обязательно есть в каждом варианте (например, фамилия, имя, отчество или день, месяц, год и др.). Формировать отдельную единицу структурного типа. Программа должна содержать раздельные функции осуществляющие... подробнее

Показать сообщение отдельно
eL'f
0 / 0 / 0
Регистрация: 04.11.2010
Сообщений: 6

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

20.12.2011, 23:40. Просмотров 916. Ответов 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;
}
буду благодарна любой подсказке.спасибо!
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru