Advertisement
steluxa

Untitled

Feb 24th, 2022
40
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.26 KB | None | 0 0
  1. #include <windows.h>
  2. #include <stdio.h>
  3. #include <cstdio>
  4. #include <cstring>
  5. #include <io.h>
  6. #include <cstdlib>
  7. #include <clocale>
  8.  
  9. const int MAX_LIMIT = 10000;
  10.  
  11. BOOL FileExists(LPCSTR path)
  12. {
  13. return (_access(path, 0) == 0);
  14. }
  15.  
  16. int main (int argc, char * argv[]) {
  17. setlocale(0, "");
  18.  
  19. HANDLE stdOut = GetStdHandle(STD_OUTPUT_HANDLE);
  20. // Выделяем память с помощью функции HeapAlloc
  21. LPSTR errorMsg = (char*)HeapAlloc(GetProcessHeap(), 0, MAX_LIMIT);
  22. DWORD written = 0;
  23.  
  24. // Проверка количества аргументов. В случае если аргументов меньше, выводим сообщение
  25. // и завершаем программу
  26. if (argc < 3) {
  27. errorMsg = (LPSTR)"Usage: writefile.exe [buffer size] [filename]";
  28.  
  29. WriteConsoleA(stdOut, errorMsg, strlen(errorMsg), &written, NULL);
  30. return -1;
  31. }
  32.  
  33. // Конвертируем первый аргумент в целое число
  34. int bufferSize = atoi(argv[1]);
  35. // Если аргумент некорректный, выводим ошибку и завершаем программу
  36. if (bufferSize == 0) {
  37. errorMsg = (LPSTR)"Error: incorrect buffer size argument!";
  38. WriteConsoleA(stdOut, errorMsg, strlen(errorMsg), &written, NULL);
  39. return -1;
  40. }
  41.  
  42. LPSTR filename = argv[2];
  43. if (FileExists(filename)) {
  44. sprintf(errorMsg, "Error: file %s is already exists!", filename);
  45. WriteConsoleA(stdOut, errorMsg, strlen(errorMsg), &written, NULL);
  46. return -1;
  47. }
  48.  
  49. char input[MAX_LIMIT];
  50. WriteConsoleA(stdOut, "Input text: ", 12, &written, NULL);
  51. ReadConsole(GetStdHandle(STD_INPUT_HANDLE), input, MAX_LIMIT, &written, NULL);
  52.  
  53. // Получаем длину введенного текста
  54. int lenInput = strlen(input);
  55.  
  56. // Если размер буфера данного в качестве аргумента больше длины введенной строки
  57. // Присваиваем длине буфера длину строки
  58. bufferSize = (bufferSize > lenInput) ? lenInput : bufferSize;
  59.  
  60. HANDLE hFile = CreateFileA(filename, GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
  61.  
  62. if (hFile == INVALID_HANDLE_VALUE) {
  63. LPSTR errorText;
  64. DWORD errorTextLen = FormatMessageA(
  65. FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
  66. NULL,
  67. GetLastError(),
  68. MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT),
  69. (LPSTR)&errorText,
  70. 0,
  71. NULL
  72. );
  73.  
  74. sprintf(errorMsg, "Error while opening file: %s", errorText);
  75. WriteConsoleA(stdOut, errorMsg, strlen(errorMsg), &written, NULL);
  76. HeapFree(GetProcessHeap(), 0, errorText);
  77.  
  78. return -1;
  79. }
  80.  
  81. DWORD bytesWritten = 0;
  82. if (!WriteFile(hFile, input, bufferSize, &bytesWritten, NULL)) {
  83. LPSTR errorText;
  84. DWORD errorTextLen = FormatMessage(
  85. FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,
  86. NULL,
  87. GetLastError(),
  88. MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT),
  89. (LPSTR)&errorText,
  90. 0,
  91. NULL
  92. );
  93.  
  94. sprintf(errorMsg, "Error while opening file: %s", errorText);
  95. WriteConsoleA(stdOut, errorMsg, strlen(errorMsg), &written, NULL);
  96. HeapFree(GetProcessHeap(), 0, errorText);
  97.  
  98. return -1;
  99. }
  100.  
  101. HeapFree(GetProcessHeap(), 0, errorMsg);
  102. CloseHandle (hFile);
  103.  
  104. return 0;
  105. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement