Code: FILE *MyFile, *OUT; char temp; Symbols[3] = {'a', 'b', 'c'}; ...... MyFile = fopen("1.txt", "r"); OUT = fopen("2.txt", "wb"); while(!feof(MyFile)) { fread(&temp, 1, sizeof(char), MyFile); for(i=0; i<3; i++) if(temp == Symbols[i]) fwrite((const char*)&a[i], 1, sizeof(a[i]), OUT); } Получается файл намного больше по размеру, немогу понять как функция fwrite пишет =(
код не весь. Если ты объявлял так: char a[3][3] = {{'0','0','0'},{'1','0','1'},{'1','1','1'}}; то переменная `a` будет размером в 4 байта. Соответственно fwrite будет записывать немного больше чем ожидалось
На этот ляп ладно, можно [4][4] сделать, мня интересует как вместо символа размером 8 байт записать двоичный код размером 4?
ага, я наконец врубился что ты хочешь. кстати символ скорее 1 байт чем 8. программа твоя ..гхм.. замечательна, но работать правильно она будет только если ты изменишь там пару строчек: Code: FILE *MyFile, *OUT; char temp; Symbols[3] = {'a', 'b', 'c'}; ...... MyFile = fopen("1.txt", "r"); OUT = fopen("2.txt", "wb"); while((temp=fgetc(MyFile))!=EOF) { for(i=0; i<3; i++) if(temp == Symbols[i]) fwrite((const char*)&a[i], 1, sizeof(a[i]), OUT); }
Вы не понимаете саму суть битов. Бит - 1/8 часть байта, которая может быть либо 0 либо 1. Отдельный бит записать в файл нельзя. Записать его можно только в виде байта. Соответственно перед записью битов необходимо их паковать в байты, и при накоплении количества битов кратному 8ми, записывать их в выходной файл. Вот накатал небольшое решение для вашего вопроса: Code: #include <stdio.h> void main() { FILE *in, *out; //кодирование 3мя битами int ar[3] = {0x00, 0x05, 0x07}; //коды 'a', 'b', 'c' char buf; //тут сидит считанный байт с файла in = fopen("f1.txt", "rb"); out = fopen("f2.bin", "wb"); int count = 0; union { int out_buf; char b[4]; } data; data.out_buf = 0; while(fread(&buf, 1, 1, in)) { if(count < 8) { //не записываем, пока не наберем кратное 8ми //количество битов data.out_buf = (data.out_buf<<3) + ar[buf - 'a']; count++; } else { //запись битов fwrite(&data.b[2], 1, 1, out); fwrite(&data.b[1], 1, 1, out); fwrite(&data.b[0], 1, 1, out); data.out_buf = ar[buf - 'a']; count = 1; } } if(count > 0) { //запись остатков fwrite(&data.b[2], 1, 1, out); fwrite(&data.b[1], 1, 1, out); fwrite(&data.b[0], 1, 1, out); } fclose(out); fclose(in); } Вот пример файла для кодирования (f1.txt) 22 байта: Code: bacbabcabcbacbabcbacba После ужатия получили 12 байт, но в конце есть лишние байты, т.к. количество битов не кратно 8ми (22*3 = 66), соответственно в начале файла нужно хранить ещё выходной размер файла, чтобы опустить лишнюю информацию в конце файла, но это уже за рамками поста (пиши в ПМ, если что). Следует учитывать, что по Хаффману для каждого символа должен быть свой код, т.е. во входном файле все возможные символы должны быть предугаданы тобой, то бишь быть в массиве ar.
кто шарит реализовать звучание звука в MFC приложении.. уже пару постов создавал но так и не получилось.. посоветуйте плиз кто что знает) смотрите посты ЗДЕСЬ и ЗДЕСЬ спасибо.
Есть код. Code: struct list{int elem; list *next; list *down;}; int main() { list *curr, *head; head = NULL; curr = NULL; cin >> stolb; cin >> strok; for (int j=0; j<strok; j++){ for(int i=0; i<stolb; i++) { curr = (list*) new int [strok]; curr->elem = rand()%10+1; curr->next = head; head = curr; } curr->down = head; } return 0; } Как можно добавить еще одну строку в конец, без создание еще одной такой же структуры, переноса туда данных, потом переопределение этой и возврата данных+новая строка. Я уже все перепробовал. Максимум что удалось это добавить строку в начало. А все остальное что я пробовал заставляет вылетать программу с ошибкой при выводе структуры(залезаю где то за границы)
Вот кодес писал не так уж и давно. Там реализован класс с добавлением в конец и в позицию. PS компилил под borland C 3.1 под студию может не скомпилиться,но общий смысл понять можно и так.
Начинаю изучать C++ в наличии есть Mc Visual studio 2005 и Borland Cpp Builder 6.0 с чего начать? в Борланде пока только научился работать с циклами и массивами в консольном режиме в Visual studio пока нет как я понял там отличаются операции ввода-вывода данных в борланде cout << "World!" а в Visual Studio printf("World!") что лутьше начать изучать и подскажите пожайлусто стоящую литературу для начинающих с примерами
Ты неправильно понял. cout можно использовать и там и там. printf это оператор вывода от Си, но его можно использовать и в студии.
для использования cin/cout надо подключать библиотеку iostream.h Code: #include "iostream.h" а для printf/scanf билиотеку stdio.h Code: #include "stdio.h"
Как это с чего начать ,ты начинающий у тебя выбора нету. Скачай/Купи кингу о данном языке и начни изучать язык,для начала оставь WinAPI,учи стандартные функции языка.
n4e/\@, gisTy, xismyname Спасибо ребят Посоветуете пожайлусто литературу по данному языку которая подойдёт начинающему
Сначала определись на чём писать будешь. На си или на с++.По синтаксису они в принципе похожи,но подходы к программированию на них абсолютно разные(с++ - объектно ориентирован). Во всяких системных штуках чаще используется си,а в нормальных приложениях с++. Вот тут 2 книги от создателя с++: http://lib.ru/CPPHB/
Почитай эти две темы: 1 и 2 для новичков подойдет Джесс Либерти "C++ за 21 день" и Дейтел "Как программировать на C++". Я учился по второй, помоему она более доступно написано.
а сис штучки ненормальные чтоль? (* насчет книг. если С, то однозначно K&R. если С++, то хз. а чем вам книга Бьёрна Страуструпа не нравится?
ИМХО главное не книги, а количество написанных программ. Если прочитать Страуструпа не написав ни единой строчки кода то вряд ли научишься прогать на плюсах ;-). Лично я читал и K&R и Страуструпа но ни одну из книг не прочел от корки до корки. Так что ZET36 больше практики и будет тебе счастье. ЗЫ вот ещё хороший сайт - cplusplus.com, так описание библиотек и куча примеров.
Как "принудительно" перезагрузить компьютер в C#? Пока нашел только такой способ: Code: System.Diagnostics.Process.Start(@"cmd.exe", String.Format(@"/C {0} > {1}", "shutdown -r -f -t 0", "tmpFileName"));