2013-10-11 97 views
0

我試圖複製文件以僅使用open(),read()write()向後打印。 但是我想知道是否有一種方法可以從讀取中獲取char指針,該指針返回讀取的字節數。如果讓我怎麼去這樣做,我已經試過一次,但我結束了一個錯誤如何從讀取字符()

error: invalid type argument of ‘unary *’ (have ‘ssize_t’) 

這是代碼片段我使用

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

int main (int argc, char *argv[]) 
{ 
if(argc != 3)/*argc should be 2 for correct execution*/ 
{ 
    printf("usage: %s filename",argv[0]); 
} 
else 
{ 
    int file1 = open(argv[1], O_RDWR); 
    if(file1 == -1){ 
    printf("\nfailed to open file."); 
    return 1; 
    } 
    int reversefile = open(argv[2], O_WRONLY, O_CREAT); 
    int size =(int)lseek(file1, 0, SEEK_END)+1; 
    char file2[size]; 
    int count=size; 
    int i = 0; 

    while(read(file1, &file2[count], 1) != 0) 
    { 
    *file2[i]=*read(file1, file[count], 1); 
    write(reversefile, file2[i], size+1); 
    count--; 
    i++; 
    lseek(reversefile, i, SEEK_SET); 
    } 
} 
+0

'O_RDWR | O_CREAT'? – Duck

+0

創建一個讀寫文件。我輸錯了嗎? – user2872131

+0

您是否需要閱讀輸出文件? – Duck

回答

0

read返回一個size_t值,指示多少字節被成功讀取,它不返回指針。

你的目的,你首先需要調用read

read(file1, &file2[count], 1) 

那麼你可以通過

file2[i] = file[count]; 

訪問從文件中讀取值,我不認爲你需要調用read兩次。

此外,如果你只想要一個字符,他們使用getc更好。

char c; 
while((c=getc(file1)) != EOF){ 
    // use c 
} 
+0

謝謝你的回答。但是我不認爲file2 [i] =文件數會讓我得到我需要的字符。我上傳了我的所有代碼,使其更清晰。我想通過文件並通過char讀取它,並在另一個文件中將其重新創建。我讀了第二次閱讀,這是有道理的,但我仍然不確定如何獲取字符並將它們分配給數組。 – user2872131

+0

@ user2872131編輯過,你是否錯過了帖子中的'&'?否則它不會爲我編譯。 –

+0

我加了'&'但它仍然沒有編譯,我得到了同樣的錯誤。什麼'&'做btw?還有另一種方式來獲得角色進入數組,因爲我同意我可能不需要第二次閱讀,但如何獲得角色? – user2872131

0
  1. 您需要閱讀從文件中的所有行,並將它們保存到字符串數組。 這是100成一個字符串數組,並且每個串可具有多達999個字符+ 1(「\ 0」)

    char myfile[100][1000] 
    
  2. 您需要扭轉字符串。這可以用非常簡單的算法完成。例如:如果您的字符串是「ABCDE」,則交換'A'和'E','B'和'D'。每當你把你的戰利品交給strlen(myfile [i])/ 2,並且你在第i個位置和(strlen(myfile [i]) - 第1 - i)個位置交換角色。

  3. 現在,您可以在output.txt文件中寫入所有字符串,但以相反的順序。

    #include <stdio.h> 
    #include <string.h> 
    
    char myfile[100][1000]; 
    int n; 
    
    void readmyfile(void) 
    { 
        int i; 
        FILE *input = fopen("input.txt", "r"); 
        printf("This is in your file:\n"); 
        for(i = 0; fscanf(input, "%[^\n] ", myfile[i]) != EOF; i++) 
         printf("%s\n", myfile[i]); 
        n = i; 
        fclose(input); 
    } 
    
    void reverseall(void) 
    { 
        int i, j, len; 
        char swap; 
        for(i = 0; i < n; i++) 
        { 
         len = strlen(myfile[i]); 
         for(j = 0; j < len/2; j++) 
         { 
          swap = myfile[i][j]; 
          myfile[i][j] = myfile[i][len - 1 - j]; 
          myfile[i][len - 1 - j] = swap; 
         } 
        } 
    } 
    
    void writetooutput(void) 
    { 
        int i; 
        FILE *output = fopen("output.txt", "w"); 
        printf("This is your output file:\n"); 
        for(i = n - 1; i >= 0; i--) 
        { 
         fprintf(output, "%s\n", myfile[i]); 
         printf("%s\n", myfile[i]); 
        } 
        fclose(output); 
    } 
    
    int main() 
    { 
        readmyfile(); 
        reverseall(); 
        writetooutput(); 
        return 0; 
    } 
    
0

反轉?爲了好玩,遞歸解決方案。無需stat()seek()

提示ssize_t len = read(inf, buf, N);len,如果> = 0是讀取的字節數,否則發生錯誤。作爲0的len通常表示文件結束。

#include <stdlib.h> 
#include <stdio.h> 
#include <unistd.h> 

int read_R(int inf, size_t N) { // return 0 is good, else error 
    int result = 0; 
    char *buf = malloc(N); 
    if (buf == NULL) { 
    return -1; // Out of memory 
    } 
    ssize_t len = read(inf, buf, N); 
    if (len > 0) { 
    // read & print remainder of file 
    result = read_R(inf, N*2); 
    // print this buffer in reverse 
    while (len > 0) { 
     putchar(buf[--len]); 
    } 
    } 
    free(buf); 
    if (len < 0) { // Some I/O error, see errno 
    return 1; 
    } 
    return result; 
} 

// Usage 
int inf = open(...); 
if (read_R(inf, 4096)) { 
    ; // error 
} 
else { 
    ; // OK, every thing read and printed in reverse, memory free'd 
} 
close(inf);