改装.h& .c文件到我已经工作的.c程序

时间:2017-02-03 17:29:05

标签: c refactoring header-files

我有一个程序,我正在上课,我需要获取一个文件的内容,反转它,并将反转的内容写入另一个文件。我已经编写了一个成功完成此操作的程序(经过大量的谷歌搜索,因为我是C编程语言的新手)。然而问题是我的教授希望我们以一定的方式提交程序,并提供一些支持.h和.c文件(我理解这是一种很好的做法)。所以我希望有人可以帮我理解我如何能够把我已经存在的程序变成一个符合他的规范的程序,如下所示:

  • 他想要一个名为“file_utils.h”的文件,它具有以下两个功能的功能签名和保护

    int read_file(char * filename,char ** buffer);

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

到目前为止,我已创建此文件以尝试完成此操作。

#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”的文件,其中包含前两个函数的实现代码
  • 他想要一个名为“reverse.c”的文件,它接受命令参数,包含一个main函数,并调用前两个文件中的函数。

现在。我理解这应该如何工作,但是当我看着我编写的程序时,我不确定如何通过坚持前面提到的规范来实际完成相同的结果。

以下是成功完成所需功能的程序

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

int main(int argc, char *argv[]) {

    int file1, file2, char_count, x, k;
    char buffer;

    // if the number of parameters passed are not correct, exit
    //
    if (argc != 3) {
            fprintf(stderr, "usage %s <file1> <file2>", argv[0]);
            exit(EXIT_FAILURE);
    }
    // if the origin file cannot be opened for whatever reason, exit
    // S_IRUSR specifies that this file is to be read by only the file owner
    //
    if ((file1 = open(argv[1], S_IRUSR)) < 0) {
            fprintf(stderr, "The origin-file is inaccessible");
            exit(EXIT_FAILURE);
    }
    // if the destination-file cannot be opened for whatever reason, exit
    // S_IWUSR specifies that this file is to be written to by only the file owner
    //
    if ((file2 = creat(argv[2], S_IWUSR)) < 0) {
            fprintf(stderr, "The destination-file is inaccessible");
            exit(EXIT_FAILURE);
    }
    // SEEK_END is used to place the read/write pointer at the end of the file
    //
    char_count = lseek(file1, (off_t) 0, SEEK_END);
    printf("origin-file size is %d\n", char_count - 1);

    for (k = char_count - 1; k >= 0; k--) {
            lseek(file1, (off_t) k, SEEK_SET);

            x = read(file1, &buffer, 1);

            if (x != 1) {
                    fprintf(stderr, "can't read 1 byte");
                    exit(-1);
            }

            x = write(file2, &buffer, 1);
            if (x != 1) {
                    fprintf(stderr, "can't write 1 byte");
                    exit(-1);

            }
    }
    write(STDOUT_FILENO, "Reversal & Transfer Complete\n", 5);
    close(file1);
    close(file2);

    return 0;

}

任何关于我如何能够完成这种“重新分解”的见解将非常感谢,谢谢!

1 个答案:

答案 0 :(得分:1)

分配需要与您的程序不同的架构。不幸的是,这不是重构,而是重写。

您已经拥有read_filewrite_file的大部分内容:打开文件,确定文件长度,错误处理。这些可以复制粘贴到新功能中。

但是read_file应该调用malloc并将文件读入内存,这是不同的。

您应该在reverse.c中创建一个由main调用的新函数,以反转内存缓冲区中的字节。

该函数运行后,write_file应尝试打开该文件,并且仅在此时进行错误检查。

您的简单程序是优越的,因为它在任何I / O之前验证输出文件,并且它需要更少的内存。它的行为满足赋值,但它的形式不符合。