2014-11-03 150 views
0

對於課堂中的作業,我們的任務是使用read()函數來讀取包含數字的文件。雖然我能夠將數字讀入緩衝區,但我無法將它們從緩衝區移動到char *數組中,以便輕鬆訪問和排序它們。任何建議表示讚賞。使用read()系統調用

int readNumbers(int hexI, int MAX_FILENAME_LEN, int **array, char* fname) { 
    int numberRead = 0, cap = 2; 
    *array = (int *)malloc(cap*sizeof(int)); 
    int n; 
    int filedesc = open(fname, O_RDONLY, 0); 
    if(filedesc < 0){ 
     printf("%s: %s\n", "COULD NOT OPEN", fname); 
     return -1; 
    } 
    char * buff = malloc(512); 
    buff[511] = '\0'; 
    while(n = read(filedesc, buff+totaln, 512 - totaln) > 0) //Appears to loop only once 
      totaln += n; 
    int len = strlen(buff); 
    for (int a = 0; a < len; a++) { //Dynamically allocates array according to input size 
     if ((&buff[a] != " ") && (&buff[a] != '\n')) 
      numberRead++; 
     if (numberRead >= cap){ 
      cap = cap*2; 
      *array = (int*)realloc(*array, cap*sizeof(int)); 
     } 
    } 
    int k = 0; 
    while((int *)&buff[k]){ //attempts to assign contents of buff to array 
     array[k] = (int *)&buff[k]; 
     k++; 
    } 
} 
+0

爲什麼要將讀取的數據寫入char * buff [512]而不是單個char * buff = malloc(MAX_FILENAME_LEN)? – igon 2014-11-03 21:39:44

+0

buff是持有文件的內容,而不是文件名。但是,我確實將char * buff [512]更改爲char * buff = malloc(512)。 512被教授推薦。 – CSjunkie 2014-11-04 00:06:42

回答

3

您使用read()是錯誤的。至少有兩個嚴重錯誤:

  1. 您忽略了返回值,除了測試文件結束。
  2. 您似乎認爲read()將在讀取的數據後附加一個空字節。也許甚至會用nul字節填充緩衝區。

如果你想後read()返回到更多的數據在同一個緩衝區,而不會覆蓋你已經讀到的東西,那麼你必須傳遞一個指針在緩衝區中的第可用位置。如果您想知道總共讀取了多少個字節,則需要添加返回值。通常的模式是這樣的:

/* 
* Read as many bytes as possible, up to buf_size bytes, from file descriptor fd 
* into buffer buf. Return the number of bytes read, or an error code on 
* failure. 
*/ 
int read_full(int fd, char buf[], int buf_size) { 
    int total_read = 0; 
    int n_read; 

    while ((n_read = read(fd, buf + total_read, buf_size - total_read) > 0) { 
     total_read += n_read; 
    } 

    return ((n_read < 0) ? n_read : total_read);   
} 

已經沿着這些線路做了一些,而不是收到錯誤,您可以在read()沒有修改緩衝區中的任何元素超出buf[total_read - 1]放心。它當然沒有用零填充緩衝區的其餘部分。

請注意,直到緩衝區已滿時,讀取並非總是必需或可取;示例函數用於演示目的,因爲它似乎是你想要的。

完成此操作後,請注意您正在嘗試提取數字,就好像它們是以二進制形式記錄在文件中一樣。這可能的確如此,但如果您正在閱讀文本包含格式的數字的文件,則需要以不同方式提取數字。如果這就是你要做的,那麼在最後一個字節讀取後添加一個字符串終止符並使用sscanf()來提取數字。

+0

謝謝,我有點了解你在做什麼,但我仍然錯過了核心概念。我真的不知道如何存儲讀取的字節會有所幫助。 numbersRead用於存儲文件中的整數數量,而不是read()讀取的字節數。此外,我仍然沒有看到如何使緩衝區中的信息有用。雖然printf(「%s \ n」,buff)顯示整個文件,但我沒有看到將文件分割爲int整數數組的方式(這是我的最終目標)。另外,它正在閱讀的.txt文件是用notepad ++製作的,沒有字符格式。 – CSjunkie 2014-11-04 00:18:07

+0

在'read()'循環中,您需要跟蹤讀取到該點的總字節數,以便將* next *字節讀入緩衝區的正確部分,而不是覆蓋已讀的內容。最後,您需要讀取總數以知道有效數據佔用了多少緩衝區。示例代碼顯示瞭如何正確執行該操作。至於從您讀過的數據中提取數字,請參閱我的答案的最後一段。 – 2014-11-04 15:32:24