Работа с файлами и командной строкой - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Добрый день. В Си совсем новичок, прошу помощи, хочу и нужно разобраться. Стоит такая задача: произвести копирование файла (например, in.txt) и назвать out.txt через *arvg[], а затем сделать проверку: если файл не существует, копировать, если существует - удалить и копировать. Пока написал такой код:
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <fcntl.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. #include <io.h>
  8. #include <share.h>
  9. #define _CRT_SECURE_NO_WARNINGS
  10. int main(int argc, char* argv[])
  11. {
  12. int in, out;
  13. int n = 0;
  14. char buf[4096], p;
  15. errno_t errno_1 = _sopen_s(&in, argv[1], O_RDONLY, _SH_DENYNO, 0); //_SH_DENYRW
  16. errno_t errno_2 = _sopen_s(&out, argv[2], O_WRONLY | O_RDONLY | O_TRUNC | O_CREAT, _SH_DENYNO, 0);
  17. //FILE * in = fopen_s(&in, argv[1], 'r');
  18. //FILE * out = fopen_s(&out, argv[2], 'w');
  19. printf("%d\n",_access(argv[2], 0));
  20. if (_access(argv[2], 0) != -1) //0 - exist , 02 - access, 04 - read, 06 - read and write
  21. {
  22. while ((n = _read(in, buf, sizeof buf)) > 0)
  23. {
  24. _write(out, buf, n);
  25. }
  26. printf("File %s\nwas successfully copied as: \n%s\n", argv[1], argv[2]);
  27. }
  28. else //if (_access(argv[2], 0) != 0)
  29. {
  30. printf("Would you like to re-write the file? Press 'y' to confirm and 'no' to refuse\n");
  31. scanf_s(&p);
  32. while ((p == 'y') || (p == 'n'))
  33. {
  34. if (p == 'y')
  35. {
  36. remove(argv[2]);
  37. if (remove(argv[2]) == -1)
  38. {
  39. printf("Copying...\n");
  40. }
  41. else
  42. {
  43. printf("Removed\n");
  44. }
  45. printf("File %s \n...was successfully copied as: \n%s\n", argv[1], argv[2]);
  46. }
  47. else if (p == 'n')
  48. {
  49. exit(1);
  50. }
  51. }
  52. }
  53. system("pause");
  54. return 0;
  55. }
Как результат, просто копирование выполняется, но на следующем выполнении останавливается в первом цикле while. Visual Studio 2015. Сразу поясню насчет функций open: fopen отказывается работать, требует fopen_s, но с ней тоже не получилось реализовать. Лишь с помощью функции _sopen_s удалось хоть что-то реализовать (было долго и мучительно). Буду благодарен за разъяснения.

Решение задачи: «Работа с файлами и командной строкой»

textual
Листинг программы
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <time.h>
  4. #include <fcntl.h>
  5. #include <sys/types.h>
  6. #include <sys/stat.h>
  7. #include <io.h>
  8. #include <string.h>
  9. #include <share.h>
  10.  
  11. #define ORG_FILE argv[0]
  12. #define INP_FILE argv[1]
  13. #define OUT_FILE argv[2]
  14.  
  15. int main(int argc, char* argv[])
  16. {
  17.     FILE * in = 0;
  18.     FILE * out = 0;
  19.     size_t bytes;
  20.     unsigned char buf[4096] = { 0 };
  21.     printf("Number of arguments: %d\n",argc);
  22.     printf("Function name: %s\n", ORG_FILE);
  23.    
  24.     printf("Enter input file: ");
  25.     INP_FILE = scanf_s(&INP_FILE);
  26.     printf_s("Enter output file: ");
  27.     OUT_FILE = scanf_s(&OUT_FILE);
  28.    
  29.     errno_t ein = fopen_s(&in, INP_FILE, "rb");
  30.     if (!ein)
  31.     {
  32.         printf("Open in: done...\n");
  33.     }
  34.     else
  35.     {
  36.         fprintf(stderr, "Open in: error...\n", INP_FILE);
  37.         return 1;
  38.     }
  39.  
  40. #ifdef _DEBUG
  41.     system("pause");
  42. #endif
  43.  
  44.     errno_t eout = fopen_s(&out, OUT_FILE, "wb");
  45.     if (!eout)
  46.     {
  47.         printf("Open out: done...\n");
  48.     }
  49.     else
  50.     {
  51.         fprintf(stderr, "Open out: error...\n", OUT_FILE);
  52.         return 1;
  53.     }
  54.  
  55. #ifdef _DEBUG
  56.     system("pause");
  57. #endif
  58.  
  59.     while ((bytes = fread(buf, sizeof(char), 4096, in)) && bytes > 0)
  60.     {
  61.         if (fwrite(buf, sizeof(char), bytes, out) != bytes)
  62.         {
  63.             fprintf(stderr, "Can't be written to %s!\n", OUT_FILE);
  64.             if (fclose(in))
  65.                 fprintf(stderr, "Can't be closed %s!\n", INP_FILE);
  66.             if (fclose(out))
  67.                 fprintf(stderr, "Can't be closed %s!\n", OUT_FILE);
  68.         }
  69.     }
  70.     printf("The file %s was successfully saved as %s\n", INP_FILE, OUT_FILE);
  71.  
  72.     fclose(in);
  73.     fclose(out);
  74.  
  75. #ifdef _DEBUG
  76.     system("pause");
  77. #endif
  78.     return 0;
  79. }

Объяснение кода листинга программы

  1. Включаются необходимые заголовочные файлы для работы с файлами и командной строкой
  2. Определяются макросы ORG_FILE, INP_FILE и OUT_FILE для удобства работы с аргументами командной строки
  3. Инициализируются переменные in и out, которые будут использоваться для работы с файлами
  4. Выводится информация о количестве аргументов и имени функции
  5. Пользователю предлагается ввести имя входного файла и имя выходного файла
  6. Используется функция fopen_s для открытия входного файла. Если файл успешно открыт, выводится сообщение об успешном открытии. В противном случае выводится сообщение об ошибке и программа завершается с кодом 1
  7. Аналогично пункту 6, только для открытия выходного файла
  8. Используется цикл while для чтения входного файла по 4096 байт и записи этих байт во временный буфер buf
  9. Если запись во временный буфер была успешной, вызывается функция fwrite для записи данных из буфера в выходной файл. Если запись не удалась, выводится сообщение об ошибке и закрываются входной и выходной файлы
  10. Проверяется успешность закрытия входного и выходного файлов с помощью функции fclose
  11. Выводится сообщение об успешном сохранении файла
  12. Закрываются входной и выходной файлы
  13. Выводится сообщение о успешном завершении программы
  14. Программа завершается с кодом 0

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.167 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы