Программа для чтения текстовых файлов
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Внимание! Это довольно старый топик, посты в него не попадут в новые, и их никто не увидит. Пишите пост, если хотите просто дополнить топик, а чтобы задать новый вопрос — начните новый.
Программа запрашивает имя или путь к файлу, должна его прочитать и подсчитать кол-во символов.
Все работает до тех пор пока имя пути или файла на английском языке.
Путь к заранее созданному файлу
D:\Мои документы\программирование\...\файл.txt
на кириллице в массиве filename сохраняется как набор «кракозяблов» и естественно открыть файл не удается.Подскажите как решить эту проблему?!? Как оптимизировать код?
В общем программа нормальная. Даже оптимизировать почти нечего (но я всё-таки немного накопал). Проблема с локализованными именами файлов — из-за различия в кодировках в консоли (cp-866) и в файловой системе (cp-1251 aka windows-1251). Боремся стандартным способом.
Ещё увеличил размер буфера под имя файла: 256 — минимально для Винды. А лучше, наверное, использовать класс
string
, что бы не было проблем с усечением строк.Можно и
string
все дело в том, что методopen()
требует строку в массиве.В классе
string
есть методc_str()
, который возвращает константный указатель на строку в стиле С. То, что доктор прописал ))Алан, у меня твой код не компилируется. В этой строке
OemToCharBuff(filename, safefilename, BUFSIZE);
выдает ошибку подобного родаerror C2664:'OemToCharBuffW':cannot convert parameter 2 from 'char[256]' to 'LPWSTR'
. Если можешь объясни в чем дело.И как конкретно применить
c_str()
к моему коду?Заранее СПАСИБО :)))
Зависит от компилятора.
OemToCharBuff
— это макрос, который разворачивается либо в вызовOemToCharBuffA()
, либо в вызовOemToCharBuffW()
в зависимости от определения символаUNICODE
. Для программ с поддержкой юникода символ, естественно, определён и будет использована функцияOemToCharBuffW()
.Решений несколько:
#undef UNICODE
. Эта строка должна быть до всех директив#include
.OemToCharBuffA()
.safefilename
использовать типwchar_t
вместоchar
.Если оставить юникод и ещё подтянуть
string
, получится так:Юрий, по твоей просьбе ещё раз посмотрел твой исходный вариант и предложенные корректировки. Мне собственно добавить особенно нечего. С товарищем Аланом согласен.
Единственно, могу добавить: если целью является совпадение вычисленной длины файла с длиной файла, полученной от операционки, то файл надо открывать в двоичном режиме (
ios::in | ios::binary
).СПАСИБО, Алан, Череп!!!
С типом
wchar_t safefilename;
все заработало.The headline of the article is “Diseases of the skin”.
The article begins with the general discussion. The two layers that form the skin are the epidermis and the derma. I’d like to mention that the cells of epidermis are of two kinds and this layer varies in thickness in the different species. The derma is composed of muscular fibres and the connective-tissue fibres. I’d like to say briefly that external surface is covered by the vascular and nervous papillae, inner surface is united to the muscular or underlying tissue by a layer of fibro-fatty tissue.
Besides, skin may be covered with the hair and horny productions, such as the horns, chestnuts, ergots, claws and hoofs.
Then the author outlines that the hair varies in length, thickness in the different species. He stresses that breeding, care, heat and cold may cause changes in the thickness of the coat.
In conclusion there are diseases of the skin classified as parasitic and non-parasitic. It is reported that parasitic skin diseases are caused by animal and vegetable parasites, non-parasitic skin diseases are caused by irritation to the skin and internal causes.
I have found the article important from the point of view anatomy study.