2013-10-30 38 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)); 

確保檢查兩個函數在實際代碼中的返回值。