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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 04.01.2013, 22:16   #1
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию Вывод значений из бинарного файла

Привет! второй день уже сижу не понимаю, почему вместо нормальных числовых значений выводится непонятно что... может код криво написан либо я чего-то недопонимаю. Помогите разобраться с этими бинарными файлами...

Код:
#include <iostream>
using namespace std;
int N;//количество элементов
int i;//итератор для прохода по одномерному массиву
int c=1;
FILE *file;//файловая переменная 
char filename[100];//имя файла (адрес его нахождения)
int intin[100];//элементы одномерного массива
int intout[100];//выходной буфер
int retvalue;
int rbyte;//значения из файла
void main() {
	cout << "Specify the path to the file: ";
	gets(filename);
	file=fopen(filename, "r+b");
	if (file==NULL) {
		cout << "Error opening the file...";
	}
	else {
	cout << "Enter the amount of the elements you want to enter: ";
	cin >> N;
	while (N<=0 || N>100) {
		cout << "Wrong amount. Re-enter: ";
		cin >> N;
	}
	cout << "Enter " << N << " digits" << "\n";
	//блок ввода элементов
	for (i=0; i<N; i++) {
	cout << "# " << c << ": ";
	cin >> intin[i];
	c++;
	}
	retvalue=fwrite(intin, sizeof(int), i, file);//в переменную retvalue запишется реально считанное количество байт
	cout << "The amount of the read bytes is: " << retvalue << "\n";
	for (i=0; i<N && (rbyte=getc(file))!=EOF; intout[i++]=rbyte);//записываем в новый буфер значения из файла

	//выводит 205??
	for(i=0; i<N; i++) {
		cout << intout[i] << "\n";
	}
	fread(intout, sizeof(int), i, file);//выводит непонятное значение
    cout << intout;
	fclose(file);
	}
	system("pause");
}
Igor95 вне форума Ответить с цитированием
Старый 04.01.2013, 22:27   #2
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

Ты записываешь в файл элементы с размером sizeof(int), а читаешь однобайтовые (getc).
Son Of Pain вне форума Ответить с цитированием
Старый 04.01.2013, 22:34   #3
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

ага, с этим ясно, а вот насчет этого -
Код:
fread(intout, sizeof(int), i, file);//выводит непонятное значение
    cout << intout;
Igor95 вне форума Ответить с цитированием
Старый 05.01.2013, 07:27   #4
Son Of Pain
Участник клуба
 
Регистрация: 23.12.2010
Сообщений: 1,129
По умолчанию

А еще, прежде чем читать данные из файла, ты должен передвинуть указатель на его начало. frewind или fseek.
Son Of Pain вне форума Ответить с цитированием
Старый 06.01.2013, 00:33   #5
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

спасибо за помощь, разобрался наконец)))
Код:
#include <iostream>
using namespace std;
int N;//количество элементов
int i;//итератор для прохода по одномерному массиву
int c=1;
FILE *file;//файловая переменная 
char filename[100];//имя файла (адрес его нахождения)
int intin[100];//элементы одномерного массива
int intout[100];//выходной буфер
int retvalue;
int rbyte;//значения из файла
void main() {
	cout << "Specify the path to the file: ";
	gets(filename);
	file=fopen(filename, "r+b");
	if (file==NULL) {
		cout << "Error opening the file...";
	}
	else {
	cout << "Enter the amount of the elements you want to enter: ";
	cin >> N;
	while (N<=0 || N>100) {
		cout << "Wrong amount. Re-enter: ";
		cin >> N;
	}
	cout << "Enter " << N << " digits" << "\n";
	//блок ввода элементов
	for (i=0; i<N; i++) {
	cout << "# " << c << ": ";
	cin >> intin[i];
	c++;
	}
	retvalue=fwrite(intin, sizeof(int), i, file);//в переменную retvalue запишется реально считанное количество байт
	cout << "The amount of the read bytes is: " << retvalue << "\n";
	rewind(file);
	fread(intout, sizeof(int), i, file);//выводит непонятное значение
	for (i=0; i<retvalue; i++) {
		cout << intout[i];
	}
	fclose(file);
	}
	system("pause");
}
Igor95 вне форума Ответить с цитированием
Старый 06.01.2013, 11:48   #6
Murashov
Форумчанин
 
Аватар для Murashov
 
Регистрация: 30.10.2012
Сообщений: 121
По умолчанию

разве не адрес переменной должен стоять при считывании?
Murashov вне форума Ответить с цитированием
Старый 06.01.2013, 20:06   #7
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

intin - область массива под которую выделено определенное количество памяти (указатель почти что)...
Появилась новая проблема, при записи в конец файла элементов массива, который содержит в себе количество э-тов равных первому из файла, выводит совершенно не то...
Код:
#include <iostream>
using namespace std;
int N;//количество элементов
int i;//итератор для прохода по одномерному массиву
int c=1;
int amount=0;//начальное количество элементов
FILE *file;//файловая переменная 
char filename[100];//имя файла (адрес его нахождения)
int intin[100];//элементы одномерного массива
int intout[100];//выходной буфер
int retvalue;
int intnew;
int *pIntnew=&intnew;//значение из файла (указатель)
int fvalue;
int *pFvalue=&fvalue;//первый элемент из файла (указатель)
int arramount[100];//массив количества совпадений
int k=0;//номер элемента в массиве arramount
void main() {
	cout << "Specify the path to the file: ";
	gets(filename);
	file=fopen(filename, "a+b");
	if (file==NULL) {
		cout << "Error opening the file...";
	}
	else {
	cout << "Enter the amount of the elements you want to enter: ";
	cin >> N;
	while (N<=0 || N>100) {
		cout << "Wrong amount. Re-enter: ";
		cin >> N;
	}
	cout << "Enter " << N << " digits" << "\n";
	//блок ввода элементов (1) (элементы для ввода: 1,1,1)
	for (i=0; i<N; i++) {
	cout << "# " << c << ": ";
	cin >> intin[i];
	c++;
	}
	retvalue=fwrite(intin, sizeof(int), i, file);//в переменную retvalue запишется реально считанное количество байт
	cout << "The amount of the read elements is: " << retvalue << "\n";
	rewind(file);
	fread(intout, sizeof(int), i, file);
	for (i=0; i<retvalue; i++) {
		cout << intout[i];
	}
	fseek(file, 0, 0);//передвигаем внутренний указатель на начало файла
	retvalue=fread(pFvalue, sizeof(int), 1, file);
	cout << "Read bytes: " << retvalue << " pFalue: " << *pFvalue << "\n";//*pFvalue первое значение из файла
	//блок проверки остальных элементов файла на совпадение с первым элементом
	for (i=1; i<N; i++) {
		fseek(file, sizeof(int)*i, 0);//передвигаем указатель на второй элемент в файле
		retvalue=fread(pIntnew, sizeof(int), 1, file);//считываем это значение в переменную
		cout << "READ elements: " << retvalue << " intnew: " << *pIntnew << "\n";//выводим количество реально считанных элементов и сам текущий элемент
		if (*pIntnew==*pFvalue) {
			amount++;
			cout << "amount: " << amount << "\n";
			arramount[k]=amount;
			cout << "arramount[" << k  << "]: " << arramount[k] << "\n";
			k++;
	}
	}
	fwrite(arramount, sizeof(int), amount, file);//записываем массив, содержащий в себе кол-во элементов на каждом шаге из блока (2)
	fseek(file, 0, 0);
	retvalue=fread(intout, sizeof(int), (N+amount), file);
	cout << "retvalue: " << retvalue << "\n";
	for (i=0; i<retvalue; i++) {
		cout << intout[i];//выводит: 11100??
	}
	fclose(file);
	}
	system("pause");
}
Igor95 вне форума Ответить с цитированием
Старый 07.01.2013, 11:37   #8
Igor95
Форумчанин
 
Регистрация: 03.01.2013
Сообщений: 388
По умолчанию

Решил преобразовать задачу. чтоб разобраться... и снова тупик((( Теперрь, например, задчка такая: заменим се отрицательные элементы нулем, ну и выведем значения...
Код:
#include <iostream>
using namespace std;
int N;//количество элементов
int i;//итератор для прохода по одномерному массиву
int c=1;

FILE *file;//файловая переменная 
char filename[100];//имя файла (адрес его нахождения)
int intin[100];//элементы одномерного массива
int intout[100];//выходной буфер
int retvalue;
void main() {
	cout << "Specify the path to the file: ";
	gets(filename);
	file=fopen(filename, "w+b");
	if (file==NULL) {
		cout << "Error opening the file...";
	}
	else {
	cout << "Enter the amount of the elements you want to enter: ";
	cin >> N;
	while (N<=0 || N>100) {
		cout << "Wrong amount. Re-enter: ";
		cin >> N;
	}
	cout << "Enter " << N << " digits" << "\n";
	//блок ввода элементов (1)
	for (i=0; i<N; i++) {
	cout << "# " << c << ": ";
	cin >> intin[i];
	c++;
	}
	retvalue=fwrite(intin, sizeof(int), N, file);//в переменную retvalue запишется реально считанное количество байт
	cout << "The amount of the read elements is: " << retvalue << "\n";
	rewind(file);
	fread(intout, sizeof(int), N, file);
	cout << "In the file(what you've entered): " << "\n";
	for (i=0; i<retvalue; i++) {
		cout << intout[i];
	}
    
	for (i=0; i<N; i++) {
		fseek(file, sizeof(int)*i, 0);
		retvalue=fread(intout, sizeof(int), 1, file);
		cout << "retvalue: " << retvalue << "\n";
		cout << "intout[" << i << "]: " << intout[i] << "\n";
		if (intout[i]<0) {
			intout[i]=0;
			cout << "intout[" << i << "]: " << intout[i] << "\n";
		}
	}

	for (i=0; i<N; i++) {
		cout << intout[i];
	}

	rewind(file);
	retvalue=fwrite(intout, sizeof(int), N, file);
	cout << "\n";
	cout << "retvalue: " << retvalue;
	cout << "\n";
	cout << "In the file(result): " << "\n";
	fread(intout, sizeof(int), N, file);
	for (i=0; i<retvalue; i++) {
		cout << intout[i];
	}
	}
	fclose(file);
Igor95 вне форума Ответить с цитированием
Старый 07.01.2013, 16:56   #9
Murashov
Форумчанин
 
Аватар для Murashov
 
Регистрация: 30.10.2012
Сообщений: 121
По умолчанию

адрес переменной нужно вроде, я не уверен

к примеру
Код:
fread(&i, sizeof(int), 1, fp);
Murashov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вывод бинарного дерева. C++ vadmaruschak Помощь студентам 0 11.12.2012 13:07
вывод бинарного дерева на экран. Лунатик13 Помощь студентам 1 10.06.2012 02:16
c++ ввод и вывод бинарного дерева в файл lblondy Помощь студентам 0 02.03.2012 01:34
чтение из бинарного файла Kukurudza Общие вопросы C/C++ 6 08.09.2011 19:09
вывод на экран бинарного дерева поиска CodeNOT Общие вопросы C/C++ 0 16.02.2011 23:22