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

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

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 02.03.2015, 12:21   #1
referent
Пользователь
 
Регистрация: 31.01.2012
Сообщений: 49
По умолчанию Не работает инвертирование файла

Вот такой код:
Код:
#include <iostream>
#include <tchar.h>
#include <windows.h>
#include <math.h>
#include <clocale>

using namespace std;

int main(int argc, char* argv[])
{
    char fname[20], fnamerev[20] = " ", *buffer, *str, tmp;
    HANDLE in_file, out_file;
    DWORD file_size, num_of_read_bytes, num_of_written_bytes;
    BY_HANDLE_FILE_INFORMATION file_inf;
    BOOL read_result;
    long int n = 0;
    int len;

    SetConsoleCP(1251);
	SetConsoleOutputCP(1251);
    setlocale(LC_CTYPE,"Russian");

    cout << "Введите имя файла: " << endl;
    cin >> fname;

    if (strlen(fname) < 14) {
        strcpy(fnamerev, fname);
    } else {
        cout << "Длина имени файла превышает допустимый размер. Повторите ввод" << endl;
        cin >> fname;
    }

    //len = strlen(fnamerev);

    int dot_index = strrchr(fnamerev, '.') - fnamerev;
    len = dot_index;
    cout << "Длина имени: " << len << endl;
    for (int i = 0; i < len / 2; i++) {
        tmp = fnamerev[i];
        fnamerev[i] = fnamerev[len-i-1];
        fnamerev[len-i-1] = tmp;
    }

    cout << "Реверсивное мя файла: " << fnamerev << endl;
    system("pause");

    out_file = CreateFile(fnamerev, GENERIC_WRITE, 0,
             NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
    in_file = CreateFile(fname, GENERIC_READ, 0, NULL, OPEN_EXISTING, 0, NULL);
    GetFileInformationByHandle(in_file, &file_inf);
    file_size = file_inf.nFileSizeHigh * pow((double)2,32) + file_inf.nFileSizeLow;
    buffer = new char [file_size];

    cout << "Размер файла, байт: " << file_size << endl;
    do {
        read_result = ReadFile(
                        in_file,
                        buffer,
                        file_size,
                        &num_of_read_bytes,
                        NULL
                        );
    } while (read_result > 0 && num_of_read_bytes > 0);

    do {
        len = 0;
        while (buffer[n] != '\n') {
            len++;
            n++;
        }
        str = new char[len];
        len -= 1;
        for (int i = 0; i < len; i++) {
            str[i] = buffer[n-len-1+i];
        }
        str[len] = '\0';
        for (int i = 0; i < len / 2; i++) {
            tmp = str[1];
            str[i] = str[len-1-i];
            str[len-1-i] = tmp;
        }
        str[len] = 0x0D;
        str[len+1] = 0x0A;

        WriteFile(out_file, str, len+2, &num_of_written_bytes, NULL);
        n++;
    } while (n < file_size);

    cout << "Инвертирование произведено." << endl;

    system("pause");
    CloseHandle(in_file);
    CloseHandle(out_file);

    delete [] buffer;

    return 0;
}
Вроде должен инвертировать имя и построчно содержимое файла. Имя инвертирует, а вот с содержимым проблемы. Есть файл "12345.txt" с текстом "test file", после выполнения программы появляется файл "54321.txt" с текстом (кракозябры не вставляются) "68.aissuR_naissuR=EPYTC_CL 0H 88888888888888888888888888888888888 88888888888888888888888888888888888 88888888888888888888888888888888888 88888888888888888888888888888888888 88888888888888888888888888888888888 88888888888888888888888888888888888 88888888888888888888888888888888888 88888888888888888888888888888888888 88888888888888888888888ee
".
Не могу понять, в чем проблема.
referent вне форума Ответить с цитированием
Старый 02.03.2015, 14:44   #2
challengerr
Участник клуба
 
Аватар для challengerr
 
Регистрация: 30.07.2008
Сообщений: 1,601
По умолчанию

Код:
    do {
        read_result = ReadFile(
                        in_file,
                        buffer,
                        file_size,
                        &num_of_read_bytes,
                        NULL
                        );

    do {
        len = 0;
        while (buffer[n] != '\n') {
            len++;
            n++;
        }
        str = new char[len];
        len -= 1;
        for (int i = 0; i < len; i++) {
            str[i] = buffer[n-len-1+i];
        }
        str[len] = '\0';
        for (int i = 0; i < len / 2; i++) {
            tmp = str[i];
            str[i] = str[len-1-i];
            str[len-1-i] = tmp;
        }
        str[len] = 0x0D;
        str[len+1] = 0x0A;

        WriteFile(out_file, str, len+2, &num_of_written_bytes, NULL);
        n++;
    } while (n < file_size);




    } while (read_result > 0 && num_of_read_bytes > 0);
Так работает?
"SPACE.THE FINAL FRONTIER.This's a voyage of starship Enterprise. It's 5-year mission to explore strange new worlds,to seek out new life and civilizations,to boldly go where no man has gone before"
challengerr вне форума Ответить с цитированием
Старый 03.03.2015, 10:57   #3
ОлегС
 
Регистрация: 26.02.2015
Сообщений: 6
По умолчанию

может "дешевле" использовать итераторы
Код:
void rcopy(ifstream &is,ofstream &os){
	string buf;int r=0;
	do {
	getline(is,buf);if (!is.good()) break;
	copy(buf.rbegin(),buf.rend(),ostream_iterator<char>(os));os<<'\n';r++;
	} while (true);
	cout<<r<<" row(s) copies\n";
}
ОлегС вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Инвертирование массива netiv Паскаль, Turbo Pascal, PascalABC.NET 13 04.11.2011 01:32
инвертирование строки в C++ MyQwErTy Помощь студентам 2 23.12.2009 22:10
инвертирование(asm80836) NiCola999 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 11 21.11.2009 01:24
TP7 чтение из файла, работает но не работает!? Qousio Помощь студентам 7 02.06.2009 09:37
инвертирование строки julia23 Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 7 12.11.2007 10:36