繁体   English   中英

我的将一个文件复制到另一个文件的程序失败

[英]My program for copying one file to another fails

我试图将文件中写入的内容复制到另一个文件中(使用系统调用),但是我的代码似乎不起作用。 我首先尝试仅使用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;
}

我的实现有什么问题?

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

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

但是,正如注释所建议的那样,您可能会遇到由忽略的返回值和/或errno变量指示的errno

另外,我将避免使用Castellano专用的变量名。 编写C / C ++仍然需要懂英语,所以最好坚持用英语命名。 否则-不会说Castellano的人将很难理解您的代码。

最后-为什么要这样做? 有很多更好的C ++友好,甚至C友好的方式来复制文件-这也可以移植(您的代码不是)。 看到:

以理智,安全,高效的方式复制文件

如@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);
}

您使用的许多函数的返回值可以为您提供正在进行中的洞察力。 使用它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM