gpt4 book ai didi

c - 将 .h 和 .c 文件改造为我已经在运行的 .c 程序

转载 作者:太空宇宙 更新时间:2023-11-04 03:24:50 24 4
gpt4 key购买 nike

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

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

    int read_file( char* 文件名, char **缓冲区);

    int write_file( char* 文件名, char *buffer, int 大小);

到目前为止,我已经创建了这个文件来尝试完成这个任务。

#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”的文件,它接受命令参数,包括一个主函数,并调用前两个文件中的函数。

现在。我明白这是如何工作的,但是当我查看我以自己的方式编写的程序时,我不确定如何通过遵守前面提到的规范来实际实现相同的结果。

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

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

任何有关我如何完成这种“重构”的见解都将不胜感激,谢谢!

最佳答案

作业要求的架构与您的程序不同。不幸的是,这不是重构而是重写。

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

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

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

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

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

关于c - 将 .h 和 .c 文件改造为我已经在运行的 .c 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42029825/

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