gpt4 book ai didi

c - C:将以下代码写入函数

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

尊敬的程序员们。请您再次帮助我如何将以下代码放入程序的函数中。
我已经在线阅读并理解了功能是如何工作的,但是当我自己完成工作时,一切都会变成 pear 形/错误的(我真是个菜鸟)。
请帮助您例如将以下代码编写到函数中(例如打开输入文件)。

我的初始代码如下:

main (int argc, char **argv)
{
int bytes_read, bytes_written;
struct stat inode;
int input_fd, output_fd;
char buffer[64];
int eof = 0;
int i;

/* Check the command line arguments */
if (argc != 3)
{
printf("syntax is: %s \n", <fromfile> <tofile>\n", argv[0]);
exit (1);
}

/* Check the input file exists and is a file */
if ((stat(argv[1], &inode) == -1) || (!S_ISREG(inode.st_mode)))
{
printf("%s is not a file\n", argv[1]);
exit(2);
}

/* Check that the output file doesnt exist */
if (stat(argv[2], &inode) != -1)
{
printf("Warning: The file %s already exists. Not going to overwrite\n", argv[2]);
exit(2);
}

/* Open the input file for reading */
input_fd = open(argv[1], O_RDONLY, 0);
if (input_fd == -1)
{
printf("%s cannot be opened\n", argv[1]);
exit(3);
}

output_fd = open(argv[2], O_CREAT | O_WRONLY | O_EXCL , S_IRUSR|S_IWUSR);
if (output_fd == -1)
{
printf("%s cannot be opened\n", argv[2]);
exit(3);
}

/* Begin processing the input file here */
while (!eof)
{
bytes_read = read(input_fd, buffer, sizeof(buffer));

if (bytes_read == -1)
{
printf("%s cannot be read\n", argv[1]);
exit(4);
}

if (bytes_read > > 0)
{
bytes_written = write(output_fd, buffer, bytes_read);
if (bytes_written == -1)
{
printf("There was an error writing to the file %s\n",argv[2]);
exit(4);
}

if (bytes_written != bytes_read)
{
printf("Devistating failure! Bytes have either magically appeared and been written or dissapeard and been skipped. Data is inconsistant!\n");
exit(101);
}
}
else
{
eof = 1;
}
}
close(input_fd);
close(output_fd);

}

我尝试打开输出文件:
void outputFile(int argc, char **argv)
{
/* Check that the output file doesnt exist */

if (stat(argv[argc-1], &inode) != -1)
{
printf("Warning: The file %s already exists. Not going to overwrite\n", argv[argc-1]);
return -1;
}

/*Opening ouput files*/

file_desc_out = open(argv[i],O_CREAT | O_WRONLY | O_EXCL , S_IRUSR|S_IWUSR);
if(file_desc_out == -1)
{
printf("Error: %s cannot be opened. \n",argv[i]); //insted of argv[2] have pointer i.
return -1;
}
}

谢谢您对我现在如何在程序中引用它的任何帮助。
我试过了:
ouputfile(但我无法弄清楚这里的内容以及原因之一)。

最佳答案

也许对您来说最有用的功能是:

#include <stdio.h>
#include <stdarg.h>

extern void error_exit(int rc, const char *format, ...); /* In a header */

void error_exit(int rc, const char *format, ...)
{
va_list args;
va_start(args, format);
vfprintf(stderr, format, args);
va_end(args);
exit(rc);
}

然后,您可以编写:
if (stat(argv[2], &inode) != -1)
error_exit(2, "Warning: The file %s exists. Not going to overwrite\n",
argv[2]);

具有简洁的优点。

您编写函数来执行子任务。确定将代码分解为功能的位置非常棘手-与科学一样多。您的代码不是很大,以至于不能完全保留它-一个函数(尽管可以如上所述简化错误处理)。

如果要练习编写函数,请考虑将其拆分:
  • open_input_file()
  • open_output_file()
  • checked_read()
  • checked_write()
  • checked_close()

  • 这些功能将使您的主要代码可以编写为:
    int main(int argc, char **argv)
    {
    int bytes_read;
    int input_fd, output_fd;
    char buffer[64];

    if (argc != 3)
    error_exit(1, "Usage: %s <fromfile> <tofile>\n", argv[0]);

    input_fd = open_input_file(argv[1]);
    output_fd = open_output_file(argv[2]);

    while ((bytes_read = checked_read(input_fd, buffer, sizeof(buffer)) > 0)
    check_write(output_fd, buffer, bytes_read);

    checked_close(input_fd);
    checked_close(output_fd);
    return 0;
    }

    因为您已将错误处理隐藏在了视线之外,所以现在更容易看到程序的结构。如果您还没有足够的功能,则可以将循环嵌入函数 void file_copy(int fd_in, int fd_out)中。这样可以从 main()中消除更多混乱,并为您提供非常简单的代码。

    初步尝试打开输出文件的功能:
    void outputFile(int argc, char **argv)
    {
    /* Check that the output file doesnt exist */

    if (stat(argv[argc-1], &inode) != -1)
    {
    printf("Warning: The file %s already exists. Not going to overwrite\n", argv[argc-1]);
    return -1;
    }

    /*Opening ouput files*/

    file_desc_out = open(argv[i],O_CREAT | O_WRONLY | O_EXCL , S_IRUSR|S_IWUSR);
    if(file_desc_out == -1)
    {
    printf("Error: %s cannot be opened. \n",argv[i]); //insted of argv[2] have pointer i.
    return -1;
    }
    }

    批判:
  • 您必须在函数中定义函数使用的变量(您将希望尽可能避免使用全局变量,并且此代码中没有任何对全局变量的调用)。
  • 您必须定义返回类型。您正在打开文件-文件描述符将如何返回到调用代码?因此,返回类型应为int
  • 您仅将所需的信息传递给函数-一种简单的“信息隐藏”形式。在这种情况下,您只需要传递文件名即可。函数名称中隐含有关文件模式等的信息。
  • 通常,您必须决定如何处理错误。除非您在家庭作业设定者中另有指示,否则在出现错误时退出并显示一条适当的消息是合理的。如果返回错误指示符,则调用代码必须对其进行测试,然后决定如何处理错误。
  • 错误和警告应写入stderr,而不是stdout。主程序输出(如果有)进入stdout
  • 您的代码对于argv[i]argv[argc-1]是输出文件的名称感到困惑。从某种意义上说,只要将文件名传递给函数,这种批评就无关紧要了。但是,一致性是编程的主要优点,使用相同的表达式标识相同的东西通常是一个好主意。
  • 布局的一致性也很重要。不要在程序中同时使用if(if (;使用该语言的创始人K&R使用的规范if (表示法。
  • 同样,请确保逗号前没有空格,逗号后没有空格,并且与运算符周围的空格(例如|)一致。一致性使您的代码更易于阅读,并且阅读代码的频率要比编写代码的频率高(至少,完成 class 后,阅读比编写要多)。
  • 您不能在不返回任何值的函数中包含return -1;

  • 将代码拆分为函数时,您需要复制/移动要提取的代码段,从而留下对新函数的调用。您还需要将相关的局部变量从调用函数复制到新函数中-如果不再在调用函数中使用这些变量,则可能会删除它们。您确实启用了大多数警告,不是吗?您想了解未使用的变量等。

    创建新功能时,最重要的部分之一是确定功能的正确签名是什么。它返回值吗?如果是这样,哪个值,它的类型是什么?如果没有,它将如何处理错误?在这种情况下,如果函数遇到错误,您可能希望该函数进行纾困(终止程序)。在更大的系统中,您可能需要一致地返回错误指示符(0表示成功,负号表示失败,不同的负数表示不同的错误)。当您使用返回错误指示符的函数时,检查调用代码中的错误指示符几乎总是至关重要的。对于大型程序,大部分代码都与错误处理有关。同样,您需要确定将哪些值传递到函数中。

    我忽略了诸如“保持正确”之类的建议,因为这对于您学习C程序的阶段是过大的。

    关于c - C:将以下代码写入函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4501977/

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