2013-10-30 16 views
0

我想在C中使用低级别的函数,并希望从STDIN读取并将该信息存储在文件中。低级别的I/O - 读取/创建/写入(C)

int dash, c; 
char buffer[1024]; 
if((dash = creat("file.txt", S_IRWXU)) < 0) 
    perror("creat error"); 
while ((c = read(STDIN_FILENO, buffer, sizeof(buffer))) > 0) { 
    if (write(dash, buffer, c) != c) 
     perror("write error"); 

我在理解如何访问'file.txt'来读取它以打印到屏幕或存储到另一个文件时遇到问题。我会用'read(“file.txt”,buffer,sizeof [buffer])'吗?

编辑 现在创建 “file.txt”,但之后我想打开另外一个文件,可以说文件1(的argv [3]),并转储文件 “file.txt” 到文件1(agrv [3])。这会工作吗?

fd = open(argv[3], O_RDWR); //open 3rd arg for writing 
fd_2 = open("file.txt", O_RDWR); //open created file 
do { 
    n = read(fd_2, buffer, sizeof(buffer)); 
    if (n < 0) 
     perror("read error argv[2]"); //greater 0=succesful 
    write(STDOUT_FILENO, buffer, n); // this is where I'm stuck 
    } while (n == sizeof(buffer)); 
close(fd); 

我有两个文件现在打开,但无法弄清楚如何将“file.txt”写入argv [3]。

+0

如果你使用'科瑞()',你将清除文件的以前的内容;它是空的。没有什么可读的。 –

+0

但是,如果这是第一次“file.txt”正在写入,我应该仍然能够从中读取它的内容复制到另一个文件吗? – MBan

+0

如果文件已创建,则为空。当然,如果您愿意,可以将零字节复制到另一个文件中,但这是毫无意义的练习。在'creat()'之后,在文件中写入一些数据之前,文件中没有任何东西需要读取。 POSIX定义['creat()'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/creat.html)说:_'' creat()'函数的行为应该如下执行: 'int creat(const char * path,mode_t mode) { return open(path,O_WRONLY | O_CREAT | O_TRUNC,mode); }'_因此当你使用'creat()'时,文件描述符是不可读的。 –

回答

0

尝试一下代码。输入文件名作为第二个参数。

#include<stdio.h> 
#include<fcntl.h> 

#define MAX_BUF_SIZE 512 

int main(int argc, char **argv) 
{ 
     int fd; 
     int count,value; 
     char buf[MAX_BUF_SIZE]; 

     if(argc < 2) 
       fprintf(stderr, "Usage: a.out filename\n"); 
     else 
     { 
       fd = open(argv[1], O_RDONLY); 
       if(fd < 0) 
         fprintf(stderr, "Error In Opening File\n"); 
       else 
       { 
         fprintf(stdout, "Enter No of bytes to read from file %s\n",argv[1]); 
         fscanf(stdin,"%d",&value); 
         printf("value %d\n",value); 

         count = read(fd,buf,value); 
         buf[count]='\0'; 

         if(count <=0) 
           fprintf(stderr, "Error In Reading from file\n"); 
         else if(count < value) 
           fprintf(stdout, "Partial read data is %s\n",buf); 
         else if(count == value) 
           fprintf(stdout, "Data is: \n%s\n",buf); 
         else 
           fprintf(stderr,"Error in read."); 

       close(fd); 
       } 
     } 
     return 0; 
} 

'\ 0'被添加到缓冲区以避免任何垃圾值与输出。

注:FOPEN,FREAD是图书馆FN哪里打开,读取是系统调用

+0

scanf是一个低级函数吗? – MBan

+0

@MBan:我已经更新了我的代码。谢谢你提醒我。 'open'和'fopen'之间的区别,reffer:http://stackoverflow.com/questions/1658476/c-fopen-vs-open http://stackoverflow.com/questions/584142/what-is-the-difference -between-读取和FREAD – PearL

2

使用open()得到文件描述符:

int fd = open("file.txt", O_RDWR); 

然后你可以使用read()从这个文件描述符就像STDIN_FILENO读取。

c = read(fd, buffer, sizeof(buffer)); 

确保检查两个函数在实际代码中的返回值。