gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 09:21:45 26 4
gpt4 key购买 nike

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

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

    反向.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'(对于行 read(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 中,我得到一个段错误。

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

    最佳答案

    就在我的头顶上,未经测试,我看到了这些错误:
    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");
    第二个参数应该是一个“字符串”(指向 charchar )。 '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 中的字符串,而不是文件。你的输出
    如果你这样做,文件将比它应该长一个字符。

    关于C程序来反转文件的内容并将其写入另一个文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42033932/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com