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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 24.01.2017, 17:37   #1
LifeDiary
 
Регистрация: 24.01.2017
Сообщений: 9
Сообщение Бинарное чтение файла

Всем доброго времени суток! Уважаемые программисты, вопрос касается чтения и перезаписи файла. Суть вот в чем: Открываем файл, считываем инфу с него, причем, в режиме binnary и записываем опять в этот же файл.

Код:
FILE *ftm;
            ftm = _wfopen(fff, L"r+"); //fff - это переменная wchar_t содержащая имя файла!
        
            unsigned short buf[1025] = { 0 };
            fread(&buf, sizeof(short), 1024, ftm);
            wstring out = L"";
            wstring buf02[1025];
            for (int j = 0; j<1024; j++)
            {
                for (short i = 0; i<16; i++)
                {
                    out = out + (wchar_t)((buf[j] >> (15 - i)) & 1);
                    
                }
                buf02[j] = out;
                
                //out = L"";
                
 
            }
 
            wcout << "BINAR: " << out << endl;//вывожу то, что считывает, нолики и единички кажется :\
            fwrite(&buf, sizeof(short), 1024, ftm); //записываю обратно, после этого остается вконце текста куча пробелов
            fclose(ftm);
Этот код работает, я хотел, что бы у меня в этот же файл текст дописывался без пробелов. Допустим в file.txt есть текст "qwe123", мне нужно, что бы этот текст прочитался и дописался в этот же файл. в итоге должен получиться file.txt с текстом "qwe123qwe123". У меня всё так, плюсом ещё куча пробелов дописывается, а если ещё раз открыть файл и дописать то, что уже есть в нем("qwe123qwe123"), то должно получиться "qwe123qwe123qwe123qwe123", но уже ничего не происходит и гугл меня не спасает уже дня 3-4 не могу решить данный вопрос... Спасите

Последний раз редактировалось Аватар; 24.01.2017 в 17:49.
LifeDiary вне форума Ответить с цитированием
Старый 24.01.2017, 18:11   #2
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

А почему флаг "r"?
А ну поиграйся (просто перебери) все возможности:

0.jpg

И напиши, что получилось.
p.s.: я не специалист в программированию (только учусь), поэтому могу ошибаться... Ну ты попробуй, а там посмотрим...
ura_111 вне форума Ответить с цитированием
Старый 24.01.2017, 18:19   #3
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Цитата:
А почему флаг "r"?
Потому что там r+. Откройте глаза.

Цитата:
У меня всё так, плюсом ещё куча пробелов дописывается
Ну как записали, так и записалось:
Код:
fwrite(&buf, sizeof(short), 1024, ftm);
вы же все 1024 символа пишите в не зависимости от полученной длины строки
p51x вне форума Ответить с цитированием
Старый 24.01.2017, 18:57   #4
LifeDiary
 
Регистрация: 24.01.2017
Сообщений: 9
По умолчанию

Цитата:
Сообщение от ura_111 Посмотреть сообщение
А почему флаг "r"?
А ну поиграйся (просто перебери) все возможности:

Вложение 85835

И напиши, что получилось.
p.s.: я не специалист в программированию (только учусь), поэтому могу ошибаться... Ну ты попробуй, а там посмотрим...
Юра, добрый вечер! Я уже пробовал всё, что знаю
LifeDiary вне форума Ответить с цитированием
Старый 24.01.2017, 22:47   #5
ura_111
Участник клуба
 
Регистрация: 14.05.2016
Сообщений: 1,793
По умолчанию

Вот, что сделай:

1) Запусти у себя:
Код:
#include <conio.h>
#include <stdio.h>

int main()
{
	char buf[256] = "qwe123";

	FILE *ftm = _wfopen(L"C:/1.dat", L"wb"); //fff - это переменная wchar_t содержащая имя файла!
	if (ftm == NULL) printf("\nОшибка открытия файла\n");
	else
	{
		int i = 0;
		while (buf[i] != '\0')
		{
			fwrite(&buf[i], sizeof(char), 1, ftm);
			i++;
		}	
		fclose(ftm);
	}

	int t;
	scanf("%d", &t); // чтобы консоль быстро не закрывалась
	return 0;
}
Создаться файл ("C:/1.dat") со строкой. И если открыть этот файл, то строка будет "читаемая"... Это немного странно, - я всегда думал, что "бинарный файл" должен содержать разную "абру-котабру". Вот, например, попробовал вывести в файл "int i" (т.е. "fwrite(&i, sizeof(int), 1, ftm);"):

0.jpg

Вроде то что ожидал... А с "char" такого не получается.

2) Теперь дублирование:
Код:
#include <conio.h>
#include <stdio.h>

int main()
{
	FILE *ftm = _wfopen(L"C:/1.dat", L"rb+"); //fff - это переменная wchar_t содержащая имя файла!
	char buf[256];
	if (ftm == NULL) printf("Ошибка открытия файла");
	else
	{
		fgets(buf, 255, ftm); // считать символы из файла
		puts(buf);            // вывод на экран
		fputs(buf, ftm); // запись повтора в файл		
		fclose(ftm);
	}

	int t;
	scanf("%d", &t); // чтобы консоль быстро не закрывалась
	return 0;
}
3) Я сопоставил свой код с твоим. Я не понял, что это означает:
Код:
(wchar_t)((buf[j] >> (15 - i)) & 1);
Это перевод в бинарное представление информации?... Я всегда думал (плохо знаю файлы - могу ошибаться) что запись бинарного файла происходит при флаге "b":

2.jpg

И соответственно, программа сама должна писать "бинарного файл".

4) И ещё вопрос про типы данных. Я обошёлся одним типом ("char"), а у тебя я насчитал три, и все не основные, а экзотические (по крайней мере, я никогда не пользовался такими)... Это вас так учили? (обычно преподают по-проще).

p.s.: пиши, что думаешь.

Последний раз редактировалось ura_111; 24.01.2017 в 23:44.
ura_111 вне форума Ответить с цитированием
Старый 25.01.2017, 12:08   #6
LifeDiary
 
Регистрация: 24.01.2017
Сообщений: 9
По умолчанию

Юр, Привет! Слушай, ты гений! Работает код, который "дублирование". А вот экзотические типы переменных нужны потому, что работает WinAPI, а именно, поисковик файлов на компе)


Код:
(wchar_t)((buf[j] >> (15 - i)) & 1);
это перевод в формат (wchar_t). например у тебя есть;
Код:
char str = '1';
int strS = (int)str;
printf("%d\n",strS);
Это преобразование char в int, а точнее, преобразование в ASCII. Например, у тебя в переменной str, описанной выше, лежит значение str='q', если преобразуешь к int, то у тебя выведется strS цифрой 113 - это ASCII код буквы, если ты сделаешь вот так:
Код:
int ASCII = 122;
	char str = (char)ASCII;
	printf("%c\n", str);
то у тебя выведется буква z))
В общем, тип переменной в скобках перед переменной это преобразование одного типа к другому.

Зачем излишнее цитирование полностью поста с кодом?
Модератор

Последний раз редактировалось Аватар; 25.01.2017 в 12:36.
LifeDiary вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Бинарное чтение файла kRicha PHP 2 14.04.2013 21:50
fread и бинарное чтение файла kleric C++ Builder 11 02.06.2012 18:21
чтение из файла JoBl Win Api 8 19.01.2012 20:30
Чтение из файла на си Mostwanted Общие вопросы C/C++ 2 29.05.2011 15:42
бинарное чтение файла.. Gerry Помощь студентам 3 03.11.2009 11:59