Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.01.2012, 11:06   #1
PotatoCaptain
Пользователь
 
Регистрация: 05.12.2011
Сообщений: 40
По умолчанию Считывание с файла построчно методом fscanf

Допустим в файле у меня записаны данные построчно
Фамилия(char)
число(int)
месяц(int)
год (int)
цена(int)
как считать это в структуру? пытаюсь функцией fscanf но вылетает с ошибкой вот собственно, не могу разобратся помогите пожалуйста
вот код
Код:
#include "stdafx.h"
#include "iostream"
#include "fstream"
#include "stdio.h"
#include "string"
#include "windows.h"
using namespace std;
struct BD {char fam[30];
int x,y,z,c;};

int _tmain(int argc, _TCHAR* argv[])
{   SetConsoleCP(1251); 
	SetConsoleOutputCP(1251);
	struct BD bd[100];
	string kor;
	char y=0;
	int x=0,i=0,a=0;

	
	do{ system ("cls");
	cout << "      ******Меню*******"<< endl<< "1.Заполнить базу данных" <<endl<< "2.Показать баззу данных"<< endl<<
		"3.Корректировка базы данных"<<endl<<"4.Вывод ведомости продаж"<<endl<<"6.Конец"<<endl;
			 cin >> x;
	    
			 //вот собственно запись в файл построчно
			 if (x==1)
		{FILE *file = fopen( "file.txt", "w" );
		cout  <<"Введите колличесво покупателей"<< endl;
        cin >> a;
		for(i=0;i<a;i++)
		{cout  <<"Введите фамилию"<<i+1<<"покупателя"<< endl;
		cin>>bd[i].fam;
		fprintf(file, "%s\n", bd[i].fam);
		cout<<"Введите число"<<endl;
		cin>>bd[i].x;
		fprintf(file, "%i\n", bd[i].x);
	    cout<<"Введите месяц"<<endl;
		cin>>bd[i].y;
		fprintf(file, "%i\n", bd[i].y);
		cout<<"Введите год"<<endl;
		cin>>bd[i].z;
		fprintf(file, "%i\n", bd[i].z);
		cout<<"Введите цену"<<endl;
		cin>>bd[i].c;
		fprintf(file, "%i\n", bd[i].c);
		}
		fclose( file );
			cout << "База данных сохранена в файле: file.txt" << endl;
			 }
		
		//считывание из файла
		if (x==2)
		{cout << "******Базза данных******"<< endl;
		FILE *file = fopen( "file.txt", "r" );
		i=0;
		while (fscanf(file, "%s%i%i%i%i", bd[i].fam,bd[i].x,bd[i].y,bd[i].z,bd[i].c != EOF),i++)
        {
		      cout<<bd[i].fam<<endl<<bd[i].x<<endl<<bd[i].y<<endl<<bd[i].z<<endl<<bd[i].c<<endl;
  
         }
		fclose( file );}
	cout <<"Если хотите продолжить нажмите y"<< endl;
		cin >> y;}
	while (y=='y');


		system("pause");

	
	return 0;
}
PotatoCaptain вне форума Ответить с цитированием
Старый 23.01.2012, 11:38   #2
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Вопрос.
Зачем в программе на плюсах использовать С-ные методы работы с файлами?
Есть же класс fstream, в конце концов...

А по сабжу -- у тебя, похоже, с циклом while проблемы. Со скобками и инкрементом в условии лупа ты явно намудрил.
Код:
while (fscanf(file, "%s%i%i%i%i", bd[i].fam,bd[i].x,bd[i].y,bd[i].z,bd[i].c != EOF),i++)
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 23.01.2012, 11:47   #3
PotatoCaptain
Пользователь
 
Регистрация: 05.12.2011
Сообщений: 40
По умолчанию

Цитата:
Сообщение от Mandrivnyk Посмотреть сообщение
Вопрос.
Зачем в программе на плюсах использовать С-ные методы работы с файлами?
Есть же класс fstream, в конце концов...

А по сабжу -- у тебя, похоже, с циклом while проблемы. Со скобками и инкрементом в условии лупа ты явно намудрил.
Код:
while (fscanf(file, "%s%i%i%i%i", bd[i].fam,bd[i].x,bd[i].y,bd[i].z,bd[i].c != EOF),i++)
эту работу я уже пытался выполнить с классом fstream только при считывании из файла типов int выдавался какойто мусор
мучился долго решил переделать в fscanf
насщет проги переделал так
Код:
fscanf(file, "%s", &bd[i].fam);
		cout<<bd[i].fam<<endl;
		fscanf(file, "%f", bd[i].x);
		cout<<bd[i].x<<endl;
		fscanf(file, "%f", bd[i].y);
		cout<<bd[i].y<<endl;
		fscanf(file, "%f", bd[i].z);
		cout<<bd[i].z<<endl;
		fscanf(file, "%f", bd[i].c);
		cout<<bd[i].c<<endl;
вылетает с жуткой ошибкой
Необработанное исключение в "0x537df52c (msvcr100d.dll)" в "123412.exe": 0xC0000005: Нарушение прав доступа при записи "0xcccccccc".
в консоли видно только как считал первую фамилию и все ...

Последний раз редактировалось PotatoCaptain; 23.01.2012 в 11:49.
PotatoCaptain вне форума Ответить с цитированием
Старый 23.01.2012, 12:00   #4
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Цитата:
эту работу я уже пытался выполнить с классом fstream только при считывании из файла типов int выдавался какойто мусор
... скорее всего из-за того, что поле fam объявлено тоже в С-ном стиле -- через ж.. эээ... то есть, через массив char. И "хвостик" этого массива ('\0'), скорее всего и попадал в следующую переменную. Хотя, не видя кода, я могу только догадываться.
Ты определись, на каком языке пишешь, потому что для такой смеси существует однозначное определение -- быдлокод.
Прошу прощения за резкость.
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 23.01.2012, 12:18   #5
PotatoCaptain
Пользователь
 
Регистрация: 05.12.2011
Сообщений: 40
По умолчанию

как не видя кода, вот посмотри пожалуйста
Код:
#include "stdafx.h"
#include "iostream"
#include "fstream"
#include "stdio.h"
#include "string"
#include "windows.h"
using namespace std;
struct BD {char fam[30];
int x,y,z,c;};

int _tmain(int argc, _TCHAR* argv[])
{   SetConsoleCP(1251); 
	SetConsoleOutputCP(1251);
	struct BD bd[100];
	string kor;
	char y=0;
	int x=0,i=0,a=0;

	
	do{ system ("cls");
	cout << "      ******Меню*******"<< endl<< "1.Заполнить базу данных" <<endl<< "2.Показать баззу данных"<< endl<<
		"3.Корректировка базы данных"<<endl<<"4.Вывод ведомости продаж"<<endl<<"6.Конец"<<endl;
			 cin >> x;
	    
			 
			 if (x==1)
		{FILE *file = fopen( "file.txt", "w" );
		cout  <<"Введите колличесво покупателей"<< endl;
        cin >> a;
		for(i=0;i<a;i++)
		{cout  <<"Введите фамилию"<<i+1<<"покупателя"<< endl;
		cin>>bd[i].fam;
		fprintf(file, "%s\n", bd[i].fam);
		cout<<"Введите число"<<endl;
		cin>>bd[i].x;
		fprintf(file, "%f\n", bd[i].x);
	    cout<<"Введите месяц"<<endl;
		cin>>bd[i].y;
		fprintf(file, "%f\n", bd[i].y);
		cout<<"Введите год"<<endl;
		cin>>bd[i].z;
		fprintf(file, "%f\n", bd[i].z);
		cout<<"Введите цену"<<endl;
		cin>>bd[i].c;
		fprintf(file, "%f\n", bd[i].c);
		}
		fclose( file );
			cout << "База данных сохранена в файле: file.txt" << endl;
			 }
		
		
		if (x==2)
		{cout << "******Базза данных******"<< endl;
		FILE *file = fopen( "file.txt", "r" );
		
                 i=0;
		fscanf(file, "%s", &bd[i].fam);
		cout<<bd[i].fam<<endl;
		fscanf(file, "%f", bd[i].x);
		cout<<bd[i].x<<endl;
		fscanf(file, "%f", bd[i].y);
		cout<<bd[i].y<<endl;
		fscanf(file, "%f", bd[i].z);
		cout<<bd[i].z<<endl;
		fscanf(file, "%f", bd[i].c);
		cout<<bd[i].c<<endl;
		
         }
	cout <<"Если хотите продолжить нажмите y"<< endl;
		cin >> y;}
	while (y=='y');


		system("pause");

	
	return 0;
}

Последний раз редактировалось PotatoCaptain; 23.01.2012 в 12:22.
PotatoCaptain вне форума Ответить с цитированием
Старый 23.01.2012, 14:25   #6
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Цитата:
как не видя кода, вот посмотри пожалуйста
Я имел в виду код, где ты пытался использовать fstream...

А по поводу fscanf -- кто указатель на переменную разыменовывать будет?
Код:
fscanf(file, "%f", &(bd[i].x))
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 23.01.2012, 15:09   #7
PotatoCaptain
Пользователь
 
Регистрация: 05.12.2011
Сообщений: 40
По умолчанию

Цитата:
Сообщение от Mandrivnyk Посмотреть сообщение
Я имел в виду код, где ты пытался использовать fstream...

А по поводу fscanf -- кто указатель на переменную разыменовывать будет?
Код:
fscanf(file, "%f", &(bd[i].x))
разыменовал, выдает в консоли набор чисел
PotatoCaptain вне форума Ответить с цитированием
Старый 23.01.2012, 15:16   #8
Mandrivnyk
Software Developer
Участник клуба
 
Аватар для Mandrivnyk
 
Регистрация: 01.03.2011
Сообщений: 1,098
По умолчанию

Тьфу.
Так у тебя поля целые, а ты их в плавающий формат считываешь...
Код:
fscanf(file, "%d", &(bd[i].x))
Болтовня ничего не стоит. Покажите мне код. (c) Linus Torvalds
Помог ответ? -- Поставьте отзыв.
Выражения особой благодарности в рублевом эквиваленте отправлять сюда --> R269634919062
Mandrivnyk вне форума Ответить с цитированием
Старый 23.01.2012, 15:42   #9
PotatoCaptain
Пользователь
 
Регистрация: 05.12.2011
Сообщений: 40
По умолчанию

ОО спасибо огромное)
PotatoCaptain вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Создание и редактирование файла (построчно) в С olegarh94 Общие вопросы C/C++ 5 21.12.2011 17:22
VS/C++ считывание из файла построчно lbs Помощь студентам 0 06.06.2010 13:53
Чтение файла построчно aciiiD Компоненты Delphi 11 26.08.2009 16:36
Определения частоты пары соседних символов в каждой строке и формирования файла частот построчно ивт Паскаль, Turbo Pascal, PascalABC.NET 11 07.12.2008 20:52
Как из юникодного текстового файла прочитать его построчно и неповторяющиеся слова ввести в ListBox? SkAndrew Общие вопросы Delphi 2 10.11.2008 22:14