1 / 1 / 0
Регистрация: 11.03.2009
Сообщений: 107
|
|
1 | |
Нужна помощь в исправлении кода одной функции...12.04.2009, 20:49. Показов 1199. Ответов 17
Метки нет (Все метки)
Плиз.. помогите исправить код функции 'void Opt()', мне необходимо было создать программу которая читатет файл 'd:\file.txt' , создает и копирует всё его содержимое в типизированный файл 'd:\out.dat'
Данная функция по теории должна работать так, вводишь число равное 500 если оптовая цена какого-либо товара равна 500 то нужно вывести на экран всю строку с этим товаром (название, оптовую и розничную цены) Программа содержит меню: 1 Запись в файл 2 Вывод на экран 3 Очистка файла //очистка файла 'out.dat' 4 Поиск... 5 Выход Меню Поиск ... как раз и содержит данную функцию 'void Opt()' Код
#include <iostream.h> #include <stdio.h> #include <string.h> #include <stdlib.h> #include <conio.h> struct mon { char type[20]; int opt, rozn; char comm[40]; }; int kol=0; void WriteFile() { FILE *fi,*fo; clrscr(); if ((fi=fopen("D:\\file.txt", "r"))==0){ cout << "Error open input file!!!" ; return;} if ((fo=fopen("D:\\out.dat","w+b"))==0){ cout << "Error open output file!!!"; return;} const int dl=80; char s[dl]; mon a; while(fgets(s,dl,fi)){ strncpy(a.type,s,19); a.type[19]='\0'; a.opt=atoi(&s[20]); a.rozn=atoi(&s[25]); strncpy(a.comm,&s[30],40); fwrite(&a,sizeof(mon),1,fo); kol++; }; fclose(fi); fclose(fo); return; } void out() { FILE *fo; clrscr(); if ((fo=fopen("D:\\out.dat","rb"))==0){ cout << "Error open output file!!!"; return ;} int i; cout<<"Input number of Zapisi "; cin >>i;//после ввода i не забываем нажать Enter if (i>kol) { cout << "Zapisi net!!!"; return;} mon a; fseek(fo,sizeof(mon)*(i-1),SEEK_SET); fread(&a,sizeof(mon),1,fo); cout << "Tip: " << a.type << " opt.: " << a.opt << " rozn: " << a.rozn << endl; fclose(fo); } void ClearFile() { FILE *fo; clrscr(); if ((fo=fopen("D:\\out.dat","wb"))==0){ cout << "Error open output file!!!"<<endl; return ;} fclose(fo); } [COLOR="Red"]void Opt() { mon a; FILE *fo; if ((fo=fopen("D:\\out.dat","r"))==0){ cout << "Error open output file!!!"; return;} fseek(fo,0,SEEK_SET); int res; int p; do { res=fread(&a,sizeof(mon),1,fo); if (a.opt==p) { cout<<a.type<<" "<<a.opt<<" "<<a.rozn<<" "<<a.comm<<" "<<endl; } } while(res==1); fclose(fo); return; }[/COLOR] void Search() { char menu_2; clrscr(); int p; do { cout <<endl<< "1 Nazvanie" << endl <<"2 Optovaya" << endl << "3 Roznica" << endl << "4 Vozvrat v gl. menu"<< endl; menu_2=getch(); switch(menu_2) { // case '1': // Nazv(); // break; case '2': cout << "Vvedite optovuy cenu: " << endl; cin >> p; Opt(); break; // case '3': // Rozn(); // break; }; if (menu_2=='4') break; } while(1); clrscr(); } void main() { char menu; int i; kol=0; clrscr(); do { cout <<endl<< "1 Zapis' v file" << endl <<"2 Vivod na ekran" << endl << "3 Ochistka file" << endl << "4 Search..."<< endl << "5 Vichod" << endl; menu=getch(); switch(menu) { case '1': WriteFile(); break; case '2': out(); break; case '3': ClearFile(); break; case '4': Search(); break; }; if (menu=='5') break; } while(1); } Код
Huindai 350 400 plohoi l Samsung 500 550 norma l Sony 300 400 rtye l Acer 200 350 hgfak l символ 'l' в конце строки каждого файла ни имеет значения он просто показывает где заканчивается каждая строка.
0
|
12.04.2009, 20:49 | |
Ответы с готовыми решениями:
17
Нужна помощь в исправлении Нужна срочная помощь в исправлении программы, пожалуйста!) Нужна помощь в поиске и исправлении бага Нужна помощь в исправлении ошибок в методах cтруктуры |
577 / 571 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
|
|
12.04.2009, 20:58 | 2 |
Код
int res; int p; do { res=fread(&a,sizeof(mon),1,fo); if (a.opt==p) { cout<<a.type<<" "<<a.opt<<" "<<a.rozn<<" "<<a.comm<<" "<<endl; } } while(res==1);
1
|
176 / 168 / 27
Регистрация: 12.01.2009
Сообщений: 430
|
|
12.04.2009, 21:00 | 3 |
1
|
12.04.2009, 21:04 | 4 |
Переменная res так же не определена, а потому цикл наверняка окажется бесконечный, а файл при этом ограниченного размера, после чего начинается работа с залипшими данными от предыдущих итераций цикла
Добавлено через 1 минуту 20 секунд Пардон, про res не заметил. Снимаю свою претензию
1
|
1 / 1 / 0
Регистрация: 11.03.2009
Сообщений: 107
|
||||||
12.04.2009, 21:33 [ТС] | 5 | |||||
просто у меня p раньше иницилизировалась в меню_2
но даже если иницилизировать её в функции 'void Opt()' то никакого результата не получается
0
|
577 / 571 / 65
Регистрация: 29.01.2009
Сообщений: 1,274
|
||||||
12.04.2009, 22:08 | 7 | |||||
Подозреваю, что проблема как раз во fread. Как вариант,
1
|
12.04.2009, 22:38 | 8 |
Я исходники особо не смотрел, но этот файл он формирует в процедуре WriteFile через fwrite. Т.е. с этой точки зрения вроде бы как всё правильно (чтение и запись симметричны)
1
|
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
|
||||||
12.04.2009, 23:18 | 9 | |||||
внутри функции int p; убрать, перенести в void Opt()
Код
void Opt(int p) Код
case '2': cout << "Vvedite optovuy cenu: " << endl; cin >> p; Opt(); break; Код
do { res=fread(&a,sizeof(mon),1,fo); if (a.opt==p) { cout<<a.type<<" "<<a.opt<<" "<<a.rozn<<" "<<a.comm<<" "<<endl; } } while(res==1);
fo - file out обычно пишут когда выводишь, а когда вводишь пишут fi - file in когда открываешь файл на чтение, указатель на него помещай в fi, а когда открываешь файл на запись - в fo
1
|
1 / 1 / 0
Регистрация: 11.03.2009
Сообщений: 107
|
||||||
12.04.2009, 23:23 [ТС] | 10 | |||||
всем спасибо огромное за помощь и объяснение...
теперь появились новые проблема, почему то при использовании данной функции у меня из такого текстового файла Код
Huindai 350 400 plohoi l Samsung 500 550 norma l Sony 300 400 rtye l Acer 200 350 hgfak l 2) последняя запись с монитором Acer выводится два раза, остальные записи выводятся по одному разу как положено... как думаете с чем могут быть связаны данные проблемы
0
|
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
|
|
13.04.2009, 00:13 | 11 |
Код
cout << "Vvedite optovuy cenu: " << endl; cin >> p; когда у тебя формат ввода вынесен в отдельную функцию, её можно менять, это гораздо проще, чем лазить по всей функции, где всего лишь используется результат этого ввода, это выглядело бы как Код
Opt(EnterOptFloor()); Код
int floor; if ((floor = EnterOptFloor()) > 0) Opt(floor); а так, тебе приходится вводом заниматься в той функции, которая к нему вообще отношения не имеет
1
|
1 / 1 / 0
Регистрация: 11.03.2009
Сообщений: 107
|
|
13.04.2009, 00:32 [ТС] | 12 |
объясни пожалуйста поподробней как это решает мою проблему с этими смайликами и последней записью, которые выводится два раза... а то если честно я даже не понял куда нужно добавить то что ты написал...
0
|
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
|
||||||
13.04.2009, 01:00 | 13 | |||||
Сообщение от kandrey58region
Добавлено через 2 минуты 42 секунды ещё двоичный режим для файла b
1
|
1 / 1 / 0
Регистрация: 11.03.2009
Сообщений: 107
|
|
13.04.2009, 01:33 [ТС] | 14 |
прога то у меня работает, самое обидное ведь она и раньше работало, просто очистка экрана 'clrscr' стирала мой результат и выводила опять меню
Код
Huindai 350 400 plohoi l Samsung 500 550 norma l Sony 300 400 rtye l Acer 200 350 hgfak l Код
Samsung 500 550 norma :)
0
|
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
|
|||||||||||
13.04.2009, 04:10 | 15 | ||||||||||
Добавлено через 9 минут 46 секунд
1
|
1 / 1 / 0
Регистрация: 11.03.2009
Сообщений: 107
|
|
13.04.2009, 09:49 [ТС] | 16 |
accept, спасибо проблема со смайликами решилась...
теперь осталась одна проблема с последней записью которая выводиться на экран дважды...
0
|
13.04.2009, 12:53 | 17 | |||||
1
|
4866 / 3288 / 468
Регистрация: 10.12.2008
Сообщений: 10,570
|
|
13.04.2009, 23:51 | 18 |
https://www.cyberforum.ru/post136670.html
цикл и правильное название для файлового указателя
0
|
13.04.2009, 23:51 | |
13.04.2009, 23:51 | |
Помогаю со студенческими работами здесь
18
Нужна помощь в исправлении схемы измерительного усилителя Дерево .Помощь в исправлении ошибок Помощь в исправлении ошибок в коде Нужна помощь в написании кода Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |