// Программа из конспекта "Системное программное обеспечение" // Версия для Windows // стр. ?? // Приложение MAPFILE // отображение файла на память #include #include #include #include int main(int argc, char* argv[]) { // дескрипторы файлов HANDLE hInput, hOutput; // дескрипторы отображений HANDLE hInputMap, hOutputMap; // Указатели на отображенные области памяти LPVOID lpInput, lpOutput; // имена отображений CHAR lpInputFileName[] ="$MyInputFileName$"; CHAR lpOutputFileName[] = "$MyOutputFileName$"; DWORD FileSize; // размер входного файла LPDWORD lpFileSize=&FileSize; // указатели на вспомогательные строки char *lin, *lout, *pos; char filename[80] = { 0 }; int len, letter,start; if (argc < 3) { printf("Usage: mapfile.exe filename symbol"); exit(-1); } // формирование имени выходного файла strcpy(filename, argv[1]); //len = atoi(argv[2]); len = argv[2][0]; pos = strstr(filename,"."); if (pos == NULL) strcat(filename, ".out"); else { letter = pos - filename; //printf("Искомая строка начинается с символа %d\n", pos - filename + 1); filename[letter + 1] = 'o'; filename[letter + 2] = 'u'; filename[letter + 3] = 't'; filename[letter + 4] = 0; printf("output file name:%s\n", filename); } // открытие файлов на чтение и запись hInput = CreateFile((LPCTSTR)argv[1], // адрес строки имени файла GENERIC_READ, // режим доступа 0,// режим совместного использования файла NULL, // дескриптор защиты OPEN_EXISTING, // параметры создания FILE_FLAG_SEQUENTIAL_SCAN, // атрибуты файла NULL); // идентификатор файла с атрибутами if (hInput == (HANDLE)0xffffffff) //== INVALID_HANDLE_VALUE) { printf("Error opening input file! Error=%d\n", GetLastError()); exit(-2); } FileSize=GetFileSize( hInput, // идентификатор файла lpFileSize); if(!FileSize) printf("Error:%d\n", GetLastError()); printf("Size of input file=%d\n", (int)FileSize); hOutput = CreateFile((LPCTSTR)filename, // адрес строки имени файла GENERIC_READ|GENERIC_WRITE, // режим доступа GENERIC_READ надо для PAGE_READWRITE 0,// режим совместного использования файла NULL, // дескриптор защиты CREATE_ALWAYS, // параметры создания FILE_ATTRIBUTE_NORMAL, // атрибуты файла NULL); // идентификатор файла с атрибутами if (hOutput == (HANDLE)0xffffffff) //== INVALID_HANDLE_VALUE) { printf("Error opening output file! Error=%d\n", GetLastError()); exit(-3); } // отображение входного файла на память hInputMap = CreateFileMapping(hInput, NULL, PAGE_READONLY, 0, 0, lpInputFileName); if (!hInputMap) { printf("Error mapping input file!\n"); if (GetLastError() == ERROR_ALREADY_EXISTS) printf("Mapping already exist!\n"); exit(-4); } // выполнение отображения входного файла lpInput= MapViewOfFile( hInputMap, // идентификатор отображения FILE_MAP_READ, // режим доступа 0, // смещение в файле (старшее слово) 0, // смещение в файле (младшее слово) 0);// количество отображаемых байт. 0 - весь файл! if (!lpInput) { printf("Error open map for input file! Error=%d\n", GetLastError()); exit(-6); } // выделение динамической памяти. LPVOID++ сделать нельзя!!! lin = (char*)calloc((int)FileSize, sizeof(char)); lout = (char*)calloc((int)FileSize, sizeof(char)); // копирование отображения в строку strcpy(lin,(char*) lpInput); // работа с содержимым взодного файла letter = 0; start = 0; while (letter<(int)FileSize) { if (lin[letter] != len) { lout[start] = lin[letter]; start++; } letter++; } printf("\nOutput:%s", lout); // отображение выходного файла на память, start - его размер hOutputMap = CreateFileMapping(hOutput, NULL, PAGE_READWRITE, 0, start, lpOutputFileName); if (!hOutputMap) { printf("Error mapping output file! Error=%d\n", GetLastError()); if (GetLastError() == ERROR_ALREADY_EXISTS) printf("Mapping already exist!\n"); exit(-5); } // выполнение отображения выходного файла lpOutput = MapViewOfFile( hOutputMap, // идентификатор отображения FILE_MAP_WRITE, // режим доступа 0, // смещение в файле (старшее слово) 0, // смещение в файле (младшее слово) 0);// количество отображаемых байт. 0 - весь файл! if (!lpOutput) { printf("Error open map for output file! Error=%d\n", GetLastError()); exit(-6); } // запись отображения выходного файла strcpy((char*)lpOutput, lout); // Отмена отображения файлов, закрытие дескрипторов UnmapViewOfFile(lpInput); UnmapViewOfFile(lpOutput); CloseHandle(hInput); CloseHandle(hOutput); return 0; }