C程序反转文件内容并将其写入另一个文件

C program to reverse content of a file and write that to another file

我在分配时遇到问题,我必须将一个文件的内容放入缓冲区,反转这些内容,然后将它们写入另一个文件。该程序需要使用如下两个函数:

到目前为止,我的文件如下所示:

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 的警告,例如

最重要的是,当我继续 运行 这样的可执行文件时

./a.out file1 file2

文件 1 中的文本应该反转到文件 2 中,我遇到了分段错误。

任何对我可以解决的问题的见解都将不胜感激。

您的代码最重要的问题在这里

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

也许你的意思是

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

你也在混合IO函数。对于 FILE * 对象,您应该使用 fread() 而不是 read(),编译器应该会发出 incompatible arguments 警告。

如果没有警告(BTW char *x = &buffer + k 应该触发另一个警告),那么你应该显式启用它们,以便你的编译器可以帮助你找出其他问题。

此外,检查 file1 不是 NULLfopen() 之后,检查 fread() 是否读取了请求的数量,通常检查您可能出现的每一个错误可以很容易地从隐含函数的 return 值推断出,如果您不知道此类值的含义,请在使用此类函数之前阅读文档。

就在我的脑海中,没有测试,我看到了这些错误:

buffer = malloc(size); 应该是 *buffer = malloc(size);

...因为buffer是指向char的指针,你需要 取消引用一次。

read(file1, &buffer, 1); 应该是 fread(*buffer, 1, size, file1);

...因为你用fopen打开了file1,所以是FILE *read 是 Unix I/O,不是流 I/O,也不使用 FILE *

file2 = fopen(filename, 'w'); 应该是 file2 = fopen(filename, "w");

第二个参数应该是 "string"(指向 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 。那将是 '[=42=]'(零),而不是 '\O'(字母 O)。在任何情况下,都不需要或 通缉。 NUL 用于终止 C 中的字符串,而不是文件。你的输出 如果您这样做,文件将比应有的长度长一个字符。

最后在一起:

#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;
}   

带直播demo。请为所有 return 值添加检查,例如 malloc() 不会 return NULL.