2012-11-23 29 views
1

現在,我有如何獲取文件中的元素數量?

int main(int argc, char *argv[]) { 
    if (argc != 3) { 
     printf("Invalid number of command line parameters, exiting...\n"); 
     exit(1); 
    } 

    int *numReadings; 
    load_readings(argv[1], numReadings); 

    return 0; 
} 

    int *load_readings(char fileName[], int *numReadings) { 
     FILE *in = NULL; 
     in = fopen(fileName, "r"); 

     if (in == NULL) { 
      printf("Unable to open a file named \"%s\", exiting...\n", fileName); 
      fclose(in); 
      exit(4); 
     } 

     printf("%s\n", fileName); 
     int size = atoi(fileName); 
     printf("Size is %d\n", size); 
     int *data = (int *) calloc(size, sizeof(int)); 

     int i; 
     for (i = 0; i < size; i++) 
      fscanf(in, "%d", (data + i)); 
     } 
    } 

當我做大小=的atoi(文件名)則返回0多個網站,包括這一次,我見過的人做「的atoi(argv的[1])」但我經常返回0.我的sample.txt文件有一堆由空格分隔的3位數字。我的印象是,一旦我獲得了正確的尺寸,它下面的所有東西都可以工作。

+5

我認爲你對'atoi'的作用感到困惑 - 它只是將一個表示爲字符串的整數轉換爲實際的整數。所以,除非你的文件名是「12345」,否則不會做太多。 –

+1

atoi不返回大小 –

+1

請參見['stat'](http://pubs.opengroup.org/onlinepubs/9699919799/functions/stat.html)函數。 –

回答

1

atoi不會告知size,它只是將string轉換爲integer
對於瞭解文件的size你需要尋求到文件的末尾,然後詢問位置:

fseek(fp, 0L, SEEK_END); // seek to end of file 
    size = ftell(fp); //get current file pointer 
    fseek(f, 0, SEEK_SET); // seek back to beginning of file 
+0

我結束了使用這個,然後除ftell(fp)4.謝謝 –

0

atoi(string_value)返回數僅當string_value可以轉換爲一個整數,例如int size = atoi("1");,的size值將是1。但是,如果int size = atoi("asd");的值將爲0,因爲asd不能轉換爲整數

如果要獲取文件大小,可以使用struct stat

+0

我不相信我想'stat',因爲我想要文件中的元素數(例如,我的文件有48位三位數字),但我不會知道它是48. –

+1

@ user1799147如果您具有文件的總大小和文件中每個元素的大小,則可以輕鬆計算元素的數量。 –

+0

我明白了,你可以嘗試'fseek'和'ftell'功能。 – bhuang3

0

atoi()將字符串轉換爲整數,好像你想知道文件的大小,或者具體,文件中有多少個號碼分配內存,如果數據看起來酷似123 123 123...用空格分隔的3位數的號碼,然後使用stat()返回文件的大小以字節爲單位可以只以4分:

struct stat st; 
/* find the file size in bytes */ 
/* should check for errors */ 
fstat(fileName, &st); 

/* divide the number of bytes by 4 to get the number of numbers */ 
int size = st.st_size/4; 

/* just in case the last number doesn't have a space */ 
size += (st.st_size % 4) != 0; 

/* allocate memory */ 
int *data = calloc(size, sizeof(int)); 

注:我不太喜歡這個解決方案,喲你應該分配一個初始緩衝區,比如說100個整數,如果你需要更多,你應該使用realloc()