powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Бинарный файл и массив символов.
16 сообщений из 16, страница 1 из 1
Бинарный файл и массив символов.
    #39285651
otars
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Простая программка,вводим строку и сохраняем её в бинарный файл,а потом читаем эти значения с бинарного файла но предварительно подсчитав символы

Вот главная программа

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
int _tmain(int argc, _TCHAR* argv[])
{
	setlocale(LC_ALL,"Russian");
	FILE *fd;
	char t [255];//Исходная строка для работы с программой
	int i = 0,n=255;
    cout<<"Введите исходную фразу"<<endl;
	gets(t);
	cout<<"Исходная фраза"<<endl;
	puts(t);
	cout<<"Сохранение в двоичный файл"<<endl;
    fd=fopen("test.dat","wb+");	
	for(int i =0 ;i<strlen(t);i++)
	{
		int k=strlen(t);
	fwrite(&t, sizeof(char), k, fd);
	fclose(fd);
	}
	calculate_symb(fd,t);
	system("pause");
	return 0;
}



А вот сама функция где и начинаются все проблемы.

До применения функции memset мой массив symv забивался мусором и выводил же его.
После того как я её применил уже выводится пустая строка и при по шаговой отладке,массив symv пустой,но это понятно.
Но почему он не выводит значения с бинарного файла в массив и на экран?
От мусора очистил,циклом прохожу по всем символам и считываю их с помощью fread.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
void calculate_symb(FILE *fd,char t[])
{	
	fd=fopen("test.dat","rb");
	if (!fd) 
       printf("Ошибка!Файл не найден!\n");
    else
	{
	fseek(fd,0L,SEEK_END);
	long fsize=ftell(fd);	
	int n=fsize;
	cout<<"Количество символов в файле = "<<fsize<<endl;
	char * symv = new char[n];
	memset(symv,NULL,n);
	cout<<"Вывод содержимого двоичного файла:"<<endl;
	for(int i = 0; i<n; i++)
	{
		fread(symv, sizeof(char), 1, fd);
		cout << symv; 
		//fclose(fd);
	}
	fclose(fd);
	cout<<endl;
}
}
...
Рейтинг: 0 / 0
Бинарный файл и массив символов.
    #39285658
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
otarsА вот сама функция где и начинаются все проблемы.Нет, проблемы начинаются намного раньше.

Можешь объяснить смысл этого цикла?
Код: plaintext
1.
2.
3.
4.
5.
6.
	for(int i =0 ;i<strlen(t);i++)
	{
		int k=strlen(t);
	fwrite(&t, sizeof(char), k, fd);
	fclose(fd);
	}
...
Рейтинг: 0 / 0
Бинарный файл и массив символов.
    #39285659
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
otars
Код: plaintext
1.
2.
for(int i =0 ;i<strlen(t);i++)
	{


зачем этот цикл????
...
Рейтинг: 0 / 0
Бинарный файл и массив символов.
    #39285660
otars
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl,
запись введённой строки символов в файл.

циклом прохожу до длины и записываю в бинарный файл и я вам сразу скажу что,то что я ввёл в консоль то и в моём бинарном файле.Прикрепляю скриншот
...
Рейтинг: 0 / 0
Бинарный файл и массив символов.
    #39285666
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
otarsзапись введённой строки символов в файл.
ошибки сначала исправьте

fclose(fd); внутри цикла


fwrite(&t, sizeof(char), k, fd); - запишет k символов за один вызов
fread(&t, sizeof(char), k, fd); - прочитает. если k будет больше длины файла - прочитается сколько есть.


проверяйте значение, возвращаемое файловыми функциями
...
Рейтинг: 0 / 0
Бинарный файл и массив символов.
    #39285667
DeviLooper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
otarsWhite Owl,
запись введённой строки символов в файл.
циклом прохожу до длины и записываю в бинарный файл
Т.е. тебя совсем не смущает, что ты в цикле после первой же записи закрываешь файл? И весь твой цикл становится просто бесполезен.
Хотя, он и изначально бесполезен. Если тебе нужно сохранить лишь одну строку, достаточно
Код: plaintext
1.
fwrite(&t, sizeof(char), strlen(t), fd);


без всякого цикла
...
Рейтинг: 0 / 0
Бинарный файл и массив символов.
    #39285697
DeviLooper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
otars,
По функции calculate_symb: зачем ты передаешь в нее параметры, если не собираешься их использовать?

Функцией
Код: plaintext
1.
fseek(fd,0L,SEEK_END);


ты устанавливаешь указатель позиции в конец файла. Поэтому и считать ничего не можешь.
Перед чтением нужно вернуть указатель в начало файла: либо rewind(fd) либо fseek(fd, 0L, SEEK_SET);

Если тебе нужно читать по одному символу, то какой смысл выделять память под целую строку? Объяви переменную char и в нее читай.

А если по заданию можно читать строку полностью, то опять без всякого цикла читай сразу и без всякого цикла: fread(symv, sizeof(char), fsize, fd);
...
Рейтинг: 0 / 0
Бинарный файл и массив символов.
    #39285723
otars
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DeviLooper,

Да мне по заданию нужно считать строку с бинарного файла и записать её в массив а потом уже делать другие операции(отсюда я и параметры не убираю)

Но после правки

Код: plaintext
1.
2.
3.
4.
fseek(fd,0L,SEEK_SET);
long fsize=ftell(fd);	
int n=fsize;
cout<<"Количество символов в файле = "<<fsize<<endl;



у меня уже не пишется количество символов как раньше,а пишется 0

А теперь про отстутсвие цикла,результат этого отрезка представлен ниже.

Код: plaintext
1.
2.
3.
4.
5.
char * symv = new char[n];
memset(symv,NULL,n);
cout<<"Вывод содержимого двоичного файла:"<<endl;
fread(symv, sizeof(char), fsize, fd);
cout << symv[n];
...
Рейтинг: 0 / 0
Бинарный файл и массив символов.
    #39285724
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
otars,

описание fseek - религия не позволяет прочитать?
...
Рейтинг: 0 / 0
Бинарный файл и массив символов.
    #39285725
DeviLooper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
otars,
Ты извини, конечно, но тебе бы неплохо сперва разобраться какая строка что делает конкретно. Глядишь и вопросов будет меньше.
Я же написал - seek нужно выставлять перед чтением из файла, а не вместо твоего seek.

Твой прежний код устанавливает позицию в конец, потом считывает ее (т.е. тем самым ты получаешь размер файла):
Код: plaintext
1.
2.
fseek(fd,0L,SEEK_END);
long fsize=ftell(fd);



А вот после этого уже и возвращай указатель в начало:
Код: plaintext
1.
fseek(fd, 0L, SEEK_SET);



И потом уже читай из файла.

Короче, разберись какая функция что делает, а то у тебя какое-то гадание на кофейной гуще...
...
Рейтинг: 0 / 0
Бинарный файл и массив символов.
    #39285733
otars
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
DeviLooper,

Спасибо за совет,заработало и кстати цикл мне пригодился.Не выводятся крякозябры.
Конечно компилятор показывает что за моей строкой гора мусора,но я присвою нуль-терминал и эту проблему уберу.

Я реализовал так

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
void calculate_symb(FILE *fd,char t[])
{	
	fd=fopen("test.dat","rb");
	if (!fd) 
       printf("Ошибка!Файл не найден!\n");
    else
	{
	fseek(fd,0L,SEEK_END);
	long fsize=ftell(fd);	
	int n=fsize;
	cout<<"Количество символов в файле = "<<fsize<<endl;
	char * symv = new char[n];
	fseek(fd,0L,SEEK_SET);
	cout<<"Вывод содержимого двоичного файла:"<<endl;
	for(int i = 0; i<n; i++)
	{
		fread(symv, sizeof(char), n, fd);
		cout << symv[i]; 
	}
	fclose(fd);
	cout<<endl;
}
}



Спасибо,вам за советы!
...
Рейтинг: 0 / 0
Бинарный файл и массив символов.
    #39285737
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
otars,

symv - удалить бы надо

и FILE *fd - параметром передавать совершенно незачем
...
Рейтинг: 0 / 0
Бинарный файл и массив символов.
    #39285740
DeviLooper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
otars
Код: plaintext
1.
2.
3.
4.
5.
	for(int i = 0; i<n; i++)
	{
		fread(symv, sizeof(char), n, fd);
		cout << symv[i]; 
	}


А теперь подумай, что у тебя происходит в цикле?
...
Рейтинг: 0 / 0
Бинарный файл и массив символов.
    #39285741
DeviLooper
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
otars за моей строкой гора мусора,но я присвою нуль-терминал и эту проблему уберу.
Ну да, для строки нужен завершающий '\0'. Не забудь под него память выделить, т.е. не new char[n] , а new char[n+1]
...
Рейтинг: 0 / 0
Бинарный файл и массив символов.
    #39288639
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
otars Простая программка,вводим строку и сохраняем её в бинарный файл,а потом читаем эти значения с бинарного файла но предварительно подсчитав символы

Это ведь классика
Код: plaintext
1.
2.
3.
while((c=getc(in))!=EOF){
      putc(out);
}


Добавьте только counter в тело оператора while
...
Рейтинг: 0 / 0
Бинарный файл и массив символов.
    #39288644
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Только
Код: plaintext
1.
putc(c,out);
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / Бинарный файл и массив символов.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]