【问题标题】:My program for copying one file to another fails我将一个文件复制到另一个文件的程序失败
【发布时间】:2018-08-19 15:03:18
【问题描述】:

我试图将文件中写入的内容复制到另一个文件(使用系统调用),但我的代码似乎不起作用。我首先尝试使用printf() 缓冲区进行打印,但它也不起作用。我的猜测是我读错了文件。

#define BUF_SIZE 200
int main(int argc, char *argv[]){

    int entrada,salida,leidos;
    char buffer[BUF_SIZE];

    entrada = open(argv[1],O_RDONLY);
    salida = creat(argv[2], 0644);

    while( (leidos = read(entrada,buffer,BUF_SIZE)) > 0 ){
        write(salida,buffer,leidos);

    }

    close(salida);
    close(entrada);

    return 0;
}

我的实现有什么问题?

【问题讨论】:

  • 你应该从查看函数的返回值开始;打开/创建/读取/写入/关闭可能会在您的代码中静默失败
  • ...特别是因为在 C++ 中,等效的文件复制是一条语句,不需要使用任何缓冲区或 while 循环。
  • @Biffen:因为它是一个格式良好(尽管有问题)的 C++ 程序。 OP 告诉我们他打算将其编写为 C++ 程序。

标签: c file system-calls


【解决方案1】:

正如@einpoklum 所说,主要问题可能必须以您打开输出文件的方式(标志和权限)进行搜索。总体而言,您的代码远未实现最低限度的调试冗长,我认为一些代码流控制将极大地帮助您检测代码中的真正问题:

#include <stdio.h>
#include <stdlib.h>

#ifndef BUF_SIZE
#define BUF_SIZE 200
#endif

int main(int argc, char *argv[])
{
    int entrada = open(argv[1], O_RDONLY);

    if (entrada == -1)
    {
        fprintf(stderr, "Error opening: %s\n", argv[1]);
        exit(-1);
    }

    int openFlags = O_CREAT | O_WRONLY | O_TRUNC;
    mode_t filePerms = S_IRUSR | S_IWUSR | S_IRGRP | S_IWGRP | S_IROTH | S_IWOTH;
    int salida = open(argv[2], openFlags, filePerms);

    if (salida == -1)
    {
        fprintf(stderr, "Error opening: %s\n", argv[2]);
        exit(-1);
    }

    ssize_t numRead;
    char buf[BUF_SIZE];

    while ((numRead = read(entrada, buf, BUF_SIZE)) > 0)
    {
        if (write(salida, buf, numRead) != numRead)
        {
            fprintf(stderr, "Writing error!\n");
            exit(-1);
        }
    }

    if (numRead == -1)
    {
        fprintf(stderr, "Reading error!\n");
        exit(-1);
    }

    if (close(entrada) == -1)
    {
        fprintf(stderr, "Input closing error!\n");
        exit(-1);
    }

    if (close(salida) == -1)
    {
        fprintf(stderr, "Output closing error!\n");
        exit(-1);
    }

    exit(0);
}

您使用的许多函数返回值可以让您深入了解正在发生的事情。使用它们。

【讨论】:

  • 非常感谢您完整而快速的回答! Stackoverflow 社区每天都给我留下深刻的印象。我确实知道我需要一些调试,但我非常沮丧,以至于我的代码无法正常工作,以至于我完全忘记了它!
  • 不,我没有尝试过你的答案和 einpoklum,但它似乎不起作用
  • 好的,但我的确实打印了一些东西吗?或者它只是返回 0 而没有错误?
  • 该死的......我修正了我的答案。请立即尝试。
【解决方案2】:

我认为您在输出中缺少适当的打开标志。试试:

salida = creat(argv[2], O_WRONLY | O_CREAT, 0644);

但是,正如 cmets 建议的那样,您可能会收到返回值和/或您忽略的 errno 变量指示的错误。

另外,我会避免使用 Castellano 特定的变量名称。写 C/C++ 无论如何都需要懂英文,所以最好还是按这个来命名;否则 - 不会说 Castellano 的人将无法理解您的代码。

最后 - 你为什么要这样做?有更好的 C++ 友好,甚至 C 友好的复制文件的方法 - 这也是可移植的(您的代码不是)。见:

Copy a file in a sane, safe and efficient way

【讨论】:

  • 非常感谢您的回答!抱歉,我总是尽量不使用 Castellano 特定的变量。至于你的问题;我这样做是因为我目前正在攻读计算机工程学位(我编写代码的主题是:操作系统介绍),我们的老师希望我们使用系统调用来读取、打开和写入文件,而不是函数.
  • @NicolasGranados:如果您觉得我的回答有用,请考虑接受和/或反对它(使用消息左侧的控件)。
猜你喜欢
  • 2019-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多