如何在Linux中用C编写文件?

Dev*_*vyn 11 c linux

我想重写Linux的"cp"命令.所以这个程序会像#./a.out originalfile copiedfile.我可以打开文件,创建新文件但不能写新文件.什么都没写.可能是什么原因?

目前的C代码是:

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

int main(int argc,char *aa[]){
    int fd,fd1;
    char buffer[100];

    if(argc!=3){
        printf("Usage : ./a.out <original> <copy> \n");
        return -1;
    }

    fd=open(aa[1],O_RDONLY,S_IRUSR);
    if(fd==-1){
        printf("file not found.\n");
        return -1;
    }
    fd1=open(aa[2],O_CREAT | O_WRONLY,S_IRUSR);
    if(fd1!=-1){
        printf("file is created.\n");
    }
    ssize_t n;
    while(n=read(fd,buffer,50)){
        write(fd1,buffer,n);
        printf("..writing..\n");
    }
    close(fd);
    close(fd1);
}
Run Code Online (Sandbox Code Playgroud)

dla*_*tte 14

您需要将read()数据写入()到新文件中:

ssize_t nrd;
int fd;
int fd1;

fd = open(aa[1], O_RDONLY);
fd1 = open(aa[2], O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR);
while (nrd = read(fd,buffer,50)) {
    write(fd1,buffer,nrd);
}

close(fd);
close(fd1);
Run Code Online (Sandbox Code Playgroud)

更新:添加正确的打开...

顺便说一句,O_CREAT可以是OR'd(O_CREAT | O_WRONLY).实际上你打开了太多的文件句柄.只做一次开放.


Chi*_*chi 10

首先,您编写的代码不可移植,即使您可以使用它.为什么在完全独立于平台的方式下使用特定于操作系统的功能呢?这是一个只使用单个头文件的版本,可以移植到任何实现C标准库的平台.

#include <stdio.h>

int main(int argc, char **argv)
{
    FILE* sourceFile;
    FILE* destFile;
    char buf[50];
    int numBytes;

    if(argc!=3)
    {
        printf("Usage: fcopy source destination\n");
        return 1;
    }

    sourceFile = fopen(argv[1], "rb");
    destFile = fopen(argv[2], "wb");

    if(sourceFile==NULL)
    {
        printf("Could not open source file\n");
        return 2;
    }
    if(destFile==NULL)
    {
        printf("Could not open destination file\n");
        return 3;
    }

    while(numBytes=fread(buf, 1, 50, sourceFile))
    {
        fwrite(buf, 1, numBytes, destFile);
    }

    fclose(sourceFile);
    fclose(destFile);

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

编辑:glibc参考有这样说:

通常,您应该坚持使用流而不是文件描述符,除非您想要执行的某些特定操作只能在文件描述符上完成.如果您是初学程序员并且不确定要使用哪些函数,我们建议您专注于格式化输入函数(请参阅格式化输入)和格式化输出函数(请参阅格式化输出).

如果您担心程序可以移植到GNU以外的系统,您还应该知道文件描述符不像流一样可移植.您可以期望任何运行ISO C的系统都支持流,但非GNU系统可能根本不支持文件描述符,或者可能只实现对文件描述符进行操作的GNU函数的子集.但是,GNU库中的大多数文件描述符函数都包含在POSIX.1标准中.