C программа для обратного содержимого файла и записи этого в другой файл

У меня возникли проблемы с заданием, когда я должен взять содержимое одного файла в буфер, перевернуть его и записать в другой файл. Эта программа нуждается в использовании двух функций, которые выглядят следующим образом:

  • int read_file( char* filename, char **buffer );
  • int write_file( char* filename, char *buffer, int size);

пока мои файлы выглядят так:

file_utils.h

 #ifndef UTILS_H
 #define UTILS_H
      int read_file(char* filename, char **buffer);
      int write_file(char* filename, char *buffer, int size);
 #endif

file_utils.c

 #include "file_utils.h"
 #include <stdlib.h>
 #include <stdio.h>
 #include <font1.h>
 #include <string.h>
 #include <sys/stat.h>
 #include <unistd.h>

 int read_file(char* filename, char **buffer) {
      FILE* file1;
      file1 = fopen(filename, "r");

      //gets the size of the file
      struct stat st;
      stat(filename, &st);
      int size = st.st_size;

      buffer = malloc(size);
      read(file1, &buffer, 1);
      return size;
 }

 int write_file(char* filename, char*buffer, int size) {
      FILE* file2;
      file2 = fopen(filename, 'w');

      for (int k = size - 1; k >= 0; k--) {
          char* x = &buffer + k;
          fprintf(file2, "%s", x);
      }
      printf(filename, '\O');
      return 1;
 }

reverse.c

 #include "file_utils.h"
 #include <stdlib.h>
 #include <stdio.h>
 #include <font1.h>
 #include <string.h>
 #include <sys/stat.h>
 #include <unistd.h>

 int main(int argc, char *argv[]) {
      char* buffer;
      char* filename1;
      char* filename2;
      int filesize;

      filename1 = argv[1];
      filename2 = argv[2];

      filesize = read_file(filename1, &buffer);
      write_file(filename2, buffer, filesize);

      return 0;
 }   

и это все, что есть. Я запускаю его с помощью "clang file_utils.c reverse.c" и получаю предупреждения для file_utils.c, например

  • incompatible integer to pointer conversion passing 'int" to parameter of type 'const char *' (для строки file1 = fopen(имя файла, 'r')
  • incompatible pointer to integer conversion passing 'FILE *' (aka 'struct_IO_FILE*') to parameter of type 'int' (для прочитанной строки (file1, &buffer, 1);)
  • то же предупреждение, что и первое, но для строки file2 = fopen(filename, 'w');
  • а также incompatible pointer types initializing 'char *' with an expression of type 'char **'; dereferences with * (для строки char* x = &buffer + k;)

помимо всего этого, когда я продолжаю запускать исполняемый файл как таковой

./a.out file1 file2

где файл 1 содержит текст, который должен быть преобразован в файл 2, я получаю ошибку сегментации.

Любое понимание вещей, которые я могу исправить, будет высоко ценится.

3 ответа

Решение

Просто без головы, без тестирования, я вижу эти ошибки:

buffer = malloc(size); должно быть *buffer = malloc(size);

... так как buffer это указатель на указатель на charВам нужно разыменовать его один раз.

read(file1, &buffer, 1); должно быть fread(*buffer, 1, size, file1);

... потому что ты открыл file1 с fopen, так что это FILE *, read Unix I/O, не потоковый I / O, и не использует FILE *,

file2 = fopen(filename, 'w'); должно быть file2 = fopen(filename, "w");

Второй аргумент должен быть "строкой" (указатель на char или массивchar). 'w' это один char,

char* x = &buffer + k; должно быть char *x = buffer + k;

buffer это указатель на char, так что вы хотите использовать его напрямую, а не брать его адрес. Также обратите внимание на стиль нанесения * рядом с переменной вместо типа. Это хорошая привычка, потому что это не означает одно и то же:

char *a, *b, *c;   /* three pointers */
char* a, b, c;     /* one pointer, two chars */

fprintf(file2, "%s", x); должно быть fprintf(file2, "%c", *x);

Первая форма относится x как начало строки и будет выводить все, начиная с этой точки, до тех пор, пока она не достигнет терминатора NUL. Вы хотите вывести только один charтак что используйте %c спецификатор и разыменование x чтобы получить char,

Лучший способ был бы fwrite(x, 1, 1, file2);

printf(filename, '\O'); не нужен и не делает то, что вы думаете. Похоже, вы намеревались написать NUL в конце. Это было бы'\0' (ноль), не '\O' (буква О). В любом случае, это не нужно или не нужно. NUL используется для завершения строки в C, а не файла. Ваш выходной файл будет на один символ длиннее, чем должен быть, если вы сделаете это.

Самая важная проблема с вашим кодом здесь

      char* x = &buffer + k;
      fprintf(file2, "%s", x);

возможно ты имеешь ввиду

      char *x = buffer + k;
      fprintf(file2, "%c", *x);

Вы также смешиваете функции ввода-вывода. Для FILE * объект, который вы должны использовать fread() вместо read(), должно быть предупреждение о несовместимых аргументах от компилятора.

Если нет предупреждений (кстати char *x = &buffer + k должно вызвать другое предупреждение), тогда вам, вероятно, следует включить их явно, чтобы ваш компилятор помог вам разобраться в других проблемах.

Кроме того, проверьте, что file1 не является NULL после fopen(), Проверь это fread() прочитал запрашиваемую сумму, в общем проверил каждую возможную ошибку, которую вы можете легко вывести из возвращаемого значения подразумеваемой функции, если вы не знаете значения такого значения, ПРОЧИТАЙТЕ ДОКУМЕНТАЦИЮ перед использованием такой функции.

И наконец все вместе:

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <sys/stat.h>
#include <unistd.h>

int read_file(char* filename, char **buffer) {
  FILE* file1;
  file1 = fopen(filename, "r");

  //gets the size of the file
  struct stat st;
  stat(filename, &st);
  int size = st.st_size;

  *buffer = malloc(size);
  fread(*buffer, size, 1, file1);
  fclose(file1);

  return size;
}

void write_file(char* filename, char*buffer, int size) {
  FILE* file2 = fopen(filename, "w"); int k;

  for (k = size - 1; k >= 0; k--) {
    fwrite(buffer + k, 1, 1, file2);
  }

  fclose(file2);
}

int main(int argc, char *argv[]) {
  char* buffer;
  char* filename1;
  char* filename2;
  int filesize;

  filename1 = "input.txt";
  filename2 = "reverse.txt";

  filesize = read_file(filename1, &buffer);
  write_file(filename2, buffer, filesize);

  free(buffer);

  return 0;
}   

с живой демонстрацией. Пожалуйста, добавьте проверки для всех возвращаемых значений, как malloc() не возвращается NULL,

Другие вопросы по тегам