如何在Ubuntu Linux中运行这个c程序

时间:2018-05-18 06:00:44

标签: c linux ubuntu

我刚刚看到一个关于在线复制文件的文件,但我不知道如何运行它,我试过" gcc -o a.c"创建一个程序,然后当我输入" ./ a"它说"用法:./源目的地"作为错误。我该怎么办?

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

#include <string.h>

#define BUFFERSIZE      4096

#define COPYMODE        0644

void oops(char *, char *);

void copy_file(char *, char *);

void copy(char *, char *);

int main(int ac, char *av[]) {

if (ac != 3) {
    fprintf(stderr, "usage: %s source destination\n", *av);
    exit(1);
}

copy(av[1], av[2]);
return 0;
}

void oops(char *s1, char *s2) {
fprintf(stderr, "Error: %s ", s1);
perror(s2);
exit(1);
}

void copy_file(char *file1, char *file2) 

{
int     in_fd, out_fd, n_chars;
char    buf[BUFFERSIZE];
struct stat in_stat, out_stat;

检查是否存在两个文件

if (stat(file1, &in_stat) == 0 && stat(file2, &out_stat) == 0) 
{
    //Check if two files are same
    if (in_stat.st_ino == out_stat.st_ino) 
    {
        //if same, do nothing
        return;
    }
}

if ( (in_fd=open(file1, O_RDONLY)) == -1 )
    oops("Cannot open ", file1);

if ( (out_fd=creat( file2, COPYMODE)) == -1 )
    oops( "Cannot creat", file2);


while ( (n_chars = read(in_fd , buf, BUFFERSIZE)) > 0 )
    if ( write( out_fd, buf, n_chars ) != n_chars )
        oops("Write error to ", file2);
if ( n_chars == -1 )
    oops("Read error from ", file1);


if ( close(in_fd) == -1 || close(out_fd) == -1 )
    oops("Error closing files","");

if (chmod(file2, in_stat.st_mode) != 0) {
    oops("Error change file mode", "");
}
}

void copy(char *file1, char *file2) 
{
struct stat in_stat, out_stat;
struct dirent *direntp;
DIR *dir_ptr;

if (stat(file1, &in_stat) != 0) 
{
    oops("File not exist", "");
}

if (S_ISDIR(in_stat.st_mode)) 
{
    if (stat(file2, &out_stat) != 0) 
    {
        if (mkdir(file2, in_stat.st_mode) != 0) 
        {
            oops("Failed to create directory", "");
        }
    }

    if ((dir_ptr = opendir(file1)) == NULL) 
    {
        oops("Failed to open directory", "");
    } else {

        while ((direntp = readdir(dir_ptr)) != NULL) 
        {
            if (strcmp(direntp->d_name, ".") && strcmp(direntp->d_name, "..")) 
            {
                char *new_file1 = (char *)malloc(strlen(file1)+strlen(direntp->d_name)+2);
                strcpy(new_file1, file1);
                strcat(new_file1, "/");
                strcat(new_file1, direntp->d_name);

                char *new_file2 = (char *)malloc(strlen(file2)+strlen(direntp->d_name)+2);
                strcpy(new_file2, file2);
                strcat(new_file2, "/");
                strcat(new_file2, direntp->d_name);

                copy(new_file1, new_file2);
                free(new_file1);
                free(new_file2);
            }
        }
        closedir(dir_ptr);
    }
}else {
    copy_file(file1, file2);
}
}

我还尝试在&#34; ./ a&#34;之后添加路径名。但仍然没有工作 对不起,我是c语言的新手

2 个答案:

答案 0 :(得分:0)

你的代码想要在“。\ a”后面加2个参数,它们是2个文本文件路径。添加此参数后,您可以运行代码而不会显示错误消息。

用法:

“。\ a -filepath1 -filepath2”

答案 1 :(得分:0)

看一下main的前几行。

int main(int ac, char *av[]) {

if (ac != 3) {
    fprintf(stderr, "usage: %s source destination\n", *av);
    exit(1);
}

main的第一个参数ac是参数的数量。当ac不等于三个时,您有代码打印错误消息,然后退出。

使用时

./a

程序的参数数量是1,只是程序本身。

您的程序似乎希望源文件和目标文件正常工作。您需要在命令行中提供它们。

./a file-1 file-2

其中file-1是源文件,file-2是目标文件。