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

时间:2010-01-05 18:41:34

标签: 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);
}

4 个答案:

答案 0 :(得分: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);

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

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

答案 1 :(得分: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;
}

编辑:glibc reference有这样说:

  

一般来说,你应该坚持下去   使用流而不是文件   描述符,除非有一些   你想要做的具体操作   只能在文件描述符上完成。   如果你是一个初学程序员   我们不确定要使用哪些功能   建议你专注于   格式化输入功能(见   格式化输入)和格式化输出   函数(参见格式化输出)。

     

如果您担心可移植性   您的程序到除以外的系统   GNU,你也应该意识到这一点   文件描述符不是可移植的   作为流。你可以期待任何系统   运行ISO C来支持流,但是   非GNU系统可能不支持文件   描述符,或者只是   实现GNU的一个子集   在文件上运行的函数   描述。大部分文件   GNU中的描述符函数   库包含在POSIX.1中   但是,标准。

答案 2 :(得分:3)

您必须在与write相同的循环中执行read

答案 3 :(得分:0)

您必须使用Mallock分配缓冲区,并为读写分配指向该缓冲区的指针。

#include <unistd.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
int main(){
    ssize_t nrd;
    int fd; 
    int fd1;

    char* buffer = malloc(100*sizeof(char));
    fd = open("bli.txt", O_RDONLY);
    fd1 = open("bla.txt", O_CREAT | O_WRONLY, S_IRUSR | S_IWUSR);
    while (nrd = read(fd,buffer,sizeof(buffer))) {
        write(fd1,buffer,nrd);
    }   

    close(fd);
    close(fd1);
    free(buffer);
    return 0;
}

确保rad文件存在并且包含某些内容。 这不是完美的,但可以。