Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / чтение файла с помощью FileRead / 8 сообщений из 8, страница 1 из 1
29.11.2007, 11:46:40
    #34974243
t0rch
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чтение файла с помощью FileRead
Здравствуйте.
Делаю курсовую по шифрованию содержимого текстового файла.
Возникли проблемы с использованием функции FileRead.
При чтении текстового файла, в котором количество символов ! = 4, никакаих проблем нет. Но когда в файле содержится 4 символа эта функция возвращает содержимое файла + какая то ерунда. Если 3 символа (или > 4), то опять все нормально... Из-за чего это может быть?

Класс:

class IOManager
{
public:
void InFile(char *Text,String PathFile);
char *OutFile(String PathFile);
protected:

private:
char Text;
int iFSeek;

};



Метод для считывания файла:

char * IOManager::OutFile(String PathFile) //
{
char * Buffer;
int hFile = FileOpen(PathFile, fmOpenRead); // открываем файл для чтения
int FileLength = FileSeek(hFile, 0, 2); // определяем длину файла
FileSeek(hFile,0,0); // переходим на начало файла

Buffer = new char[FileLength]; // выделяем память под слово, которое шифруем (количество символов = количеству символов шифр. слова)
FileRead(hFile, Buffer, FileLength); // ! Если шифровали слово "папа", в отладчике видно,
// что в переменной Buffer лежит это слово + мусор из нескольких символов
FileClose(hFile);
return Buffer;
};




В программе вызываю метод для чтения из файла:

char *Text = Manager->OutFile(PathFile); //чтение из файла в переменную Text с пом метода OutFile




Заранее благодарен.
...
Рейтинг: 0 / 0
29.11.2007, 11:57:00
    #34974293
Карабас Барабас
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чтение файла с помощью FileRead
t0rchBuffer = new char[FileLength]; Buffer = new char[FileLength +1 ]; потому что завершающий нолик нужен. И поставить его не забудь, потому что там мусор лежит.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
29.11.2007, 14:44:28
    #34975106
x_proof
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чтение файла с помощью FileRead
Карабас БарабасBuffer = new char[FileLength +1 ]; потому что завершающий нолик нужен. И поставить его не забудь, потому что там мусор лежит.
+1 уже делал. Тоже не работает. А если мне надо зашифровать "папа", то в файле должно быть написано "папа0"?
...
Рейтинг: 0 / 0
29.11.2007, 15:03:14
    #34975219
Павел. С
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чтение файла с помощью FileRead
x_proof Карабас БарабасBuffer = new char[FileLength +1 ]; потому что завершающий нолик нужен. И поставить его не забудь, потому что там мусор лежит.
+1 уже делал. Тоже не работает. А если мне надо зашифровать "папа", то в файле должно быть написано "папа0"?

Нет. 0 - это в памяти лежит. Чтобы знать где кончается строка, заданная только указателем на память.
...
Рейтинг: 0 / 0
29.11.2007, 15:05:56
    #34975241
Павел. С
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чтение файла с помощью FileRead
Код: plaintext
1.
2.
3.
4.
Buffer = new char[FileLength]; // выделяем память под слово, которое шифруем (количество символов = количеству символов шифр. слова)
FileRead(hFile, Buffer, FileLength); // ! Если шифровали слово "папа", в отладчике видно,
// что в переменной Buffer лежит это слово + мусор из нескольких символов
FileClose(hFile);
return Buffer;

надо

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
Buffer = new char[FileLength +  1 ]; // выделяем память под слово, которое шифруем (количество символов = количеству символов шифр. слова)
FileRead(hFile, Buffer, FileLength); // ! Если шифровали слово "папа", в отладчике видно,
// что в переменной Buffer лежит это слово + мусор из нескольких символов
FileClose(hFile);
//!!
Buffer[FileLength] =  0 ;
//!!
return Buffer;

Ты считываешь байты из файла, и добавляешь терминирующий ноль в конец. тогда отладчик поймет где строка кончается. и не только отладчик...
...
Рейтинг: 0 / 0
29.11.2007, 15:15:49
    #34975314
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чтение файла с помощью FileRead
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
char * IOManager::OutFile(String PathFile) //
{
    int hFile = FileOpen(PathFile, fmOpenRead); // открываем файл для чтения
    int FileLength = FileSeek(hFile,  0 ,  2 ); // определяем длину файла
    FileSeek(hFile, 0 , 0 ); // переходим на начало файла

    char * Buffer = new char[FileLength +  1 ]; // выделяем память под слово, которое шифруем + 1 символ для \0
    FileRead(hFile, Buffer, FileLength); // читаем
    Buffer[FileLength] = '\0'; // в конец добавляем \0

    FileClose(hFile);
    return Buffer;
};
в вызывающем коде не забываем сделать delete(Buffer)
...
Рейтинг: 0 / 0
29.11.2007, 15:38:37
    #34975429
x_proof
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чтение файла с помощью FileRead
Спасибо большое!!! Теперь все работает
...
Рейтинг: 0 / 0
29.11.2007, 15:49:04
    #34975482
Павел. С
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
чтение файла с помощью FileRead
x_proofСпасибо большое!!! Теперь все работает

Только учтите, что в файле также могут быть нуль-байты.

Так что, если не уверены в данных, которые будете шифровать, читайте весь файл в буфер, и запоминайте размер. А то если это просто двоичный файл(изображение, документ) нуль байт может попасться внутри самих данных.

Наверняка у Вас какой-либо блочный шифр будет, придется всеравно дополнять как-либо.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / чтение файла с помощью FileRead / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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