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

时间:2017-02-03 22:21:24

标签: c pointers input incompatibletypeerror reversing

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

  • 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(filename,'r')
  • incompatible pointer to integer conversion passing 'FILE *' (aka 'struct_IO_FILE*') to parameter of type 'int'(对于读取的行(file1,&amp; buffer,1);)
  • 与第一个相同的警告,但对于行file2 = fopen(文件名,'w');
  • incompatible pointer types initializing 'char *' with an expression of type 'char **'; dereferences with *(对于行char * x =&amp; buffer + k;)

除此之外,当我继续运行可执行文件时

./a.out file1 file2

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

对我能解决的事情的任何见解将不胜感激。

3 个答案:

答案 0 :(得分: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");

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

答案 1 :(得分:2)

您的代码最重要的问题是

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

也许你的意思是

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

您也正在混合使用IO功能。对于FILE *对象,您应该使用fread()而不是read(),编译器应该发出不兼容的参数警告。

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

另外,检查file1之后NULL是否fopen(),检查fread()是否读取了请求的金额,通常会检查每个可能容易出错的错误从隐含函数的返回值推断出来,如果你不知道这个值的含义,那么在使用这个函数之前先阅读文档。

答案 2 :(得分:0)

最后一起:

#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。请为所有返回值添加检查,例如malloc()不返回NULL