1
0
Files
nure/semester-4/ОС/lb-1/src/main.cpp
2025-04-29 22:08:00 +03:00

174 lines
4.6 KiB
C++

#include <algorithm>
#include <iostream>
#include <locale.h>
#include <stddef.h>
#include <stdio.h>
#include <stdlib.h>
// #include <stringapiset.h>
#include <tchar.h>
// #include <wchar.h>
#include <windows.h>
void reverse_file(const char *input_filename, const char *output_filename);
void reverse_string(char *str, size_t len, int codepage);
int get_codepage(const char *filename);
int main() {
// Çì³íà ëîêàë³çàö³¿ íà óêðà¿íñüêó äëÿ ñóì³ñíîñò³ ç UNICODE
// setlocale(LC_ALL, "Ukrainian");
// Çì³íà êîäîâî¿ ñòîð³íêè êîíñîë³ íà 1251 äëÿ ñóì³ñíîñò³ ç ASCII
SetConsoleOutputCP(1251);
SetConsoleCP(1251);
int tchar_size = sizeof(TCHAR);
printf("TCHAR size: %d\n", tchar_size);
char ua_strings[3][60] = {"Ñèòíèê Ñåðã³é Îëåêñ³éîâè÷",
"Ñèòíèê ªãîð Ñåðã³éîâè÷",
"Ñèòíèê Îëüãà Âîëîäèìèð³âíà"};
printf("\nua_strings:\n");
for (int i = 0; i < 3; i++) {
printf("%d: %s\n", i + 1, ua_strings[i]);
}
printf("\nua_wstrings:\n");
wchar_t ua_wstrings[3][60] = {};
for (int i = 0; i < 3; i++) {
MultiByteToWideChar(CP_ACP, 0, ua_strings[i], -1, ua_wstrings[i], 60);
printf("- - - - - - - - - - - - - - - - - - - - - -\n");
printf("%d:\n", i + 1);
_tprintf(_T("_tprintf:\t%ls\n"), ua_wstrings[i]);
std::wcout << L"std::wcout:\t" << ua_wstrings[i] << std::endl;
MessageBoxW(NULL, ua_wstrings[i], L"MessageBox", MB_OK);
}
// Êîï³þâàííÿ ìàñèâó ðÿäê³â äëÿ ïåðåâ³ðêè ñîðòóâàííÿ
wchar_t ua_wstrings_to_qsort[3][60] = {};
wchar_t *ua_wstrings_to_sort[3] = {};
for (int i = 0; i < 3; i++) {
// Êîï³þâàííÿ ìàñèâó äëÿ qsort
wcscpy(ua_wstrings_to_qsort[i], ua_wstrings[i]);
// Êîï³þâàííÿ ìàñèâó äëÿ std::sort
ua_wstrings_to_sort[i] = (wchar_t *)malloc(sizeof(wchar_t) * 60);
wcscpy(ua_wstrings_to_sort[i], ua_wstrings[i]);
}
printf("\nqsort:\n");
qsort(ua_wstrings_to_qsort, 3, sizeof(wchar_t) * 60,
(int (*)(const void *, const void *))wcscoll);
for (int i = 0; i < 3; i++) {
_tprintf(_T("%ls\n"), ua_wstrings_to_qsort[i]);
}
printf("\nstd::sort:\n");
std::sort(ua_wstrings_to_sort, ua_wstrings_to_sort + 3,
[](const wchar_t *a, const wchar_t *b) -> bool {
return wcscoll(a, b) < 0;
});
for (int i = 0; i < 3; i++) {
_tprintf(_T("%ls\n"), ua_wstrings_to_sort[i]);
}
printf("\nua_strings_from_wstrings:\n");
char ua_strings_from_wstrings[3][60] = {};
for (int i = 0; i < 3; i++) {
WideCharToMultiByte(CP_ACP, 0, ua_wstrings[i], -1,
ua_strings_from_wstrings[i], 60, NULL, NULL);
printf("%d: %s\n", i + 1, ua_strings_from_wstrings[i]);
}
printf("\nfile convertions:\n");
reverse_file("inputA.txt", "outputA.txt");
reverse_file("inputU.txt", "outputU.txt");
return 0;
}
void reverse_string(char *str, size_t len, int codepage) {
if (str == NULL || len == 0)
return;
wchar_t *wstr = (wchar_t *)malloc(sizeof(wchar_t) * (len + 1));
if (wstr == NULL) {
fprintf(stderr, "Error encountered while allocating memory\n");
return;
}
MultiByteToWideChar(codepage, 0, str, len + 1, wstr, len + 1);
size_t wlen = wcslen(wstr);
for (size_t i = 0, j = wlen - 1; i < j; i++, j--) {
wchar_t temp = wstr[i];
wstr[i] = wstr[j];
wstr[j] = temp;
}
WideCharToMultiByte(codepage, 0, wstr, len, str, len, NULL, NULL);
free(wstr);
}
void reverse_file(const char *input_filename, const char *output_filename) {
FILE *input_file = fopen(input_filename, "r");
if (input_file == NULL) {
fprintf(stderr, "Cant open input file '%s'\n", input_filename);
return;
}
FILE *output_file = fopen(output_filename, "w");
if (output_file == NULL) {
fprintf(stderr, "Cant create output file '%s'\n", output_filename);
fclose(input_file);
return;
}
int codepage = get_codepage(input_filename);
char buffer[4096];
while (fgets(buffer, sizeof(buffer), input_file) != NULL) {
size_t len = strlen(buffer);
if (len > 0 && buffer[len - 1] == '\n') {
buffer[len - 1] = '\0';
len--;
}
reverse_string(buffer, len, codepage);
fprintf(output_file, "%s\n", buffer);
}
fclose(input_file);
fclose(output_file);
printf("Successfully reversed file '%s' to '%s'\n", input_filename,
output_filename);
};
int get_codepage(const char *filename) {
FILE *file = fopen(filename, "r");
if (file == NULL) {
fprintf(stderr, "Cant open file '%s'\n", filename);
return -1;
}
int codepage;
if (fgetc(file) == 0xEF && fgetc(file) == 0xBB && fgetc(file) == 0xBF) {
codepage = CP_UTF8;
} else {
codepage = CP_ACP;
}
fclose(file);
return codepage;
}