2013-04-03 58 views
2

首先,我是C新手,但沒有編程;我在PHP中做了很多web開發。對於這個問題...C - sprintf()影響數組聲明

我有一個讀取一系列二進制文件並輸出內容的函數,但是使用sprintf()正在影響後續多維數組的內存分配。請看下圖:

FILE *fp; 

for(int i = 1; i <= 16; i++) { 

    char format_1[] = "track_%d.bin"; 
    char filename_1[sizeof format_1+100]; 
    sprintf(filename_1,format_1,i); 
    printf("Filename: %s \n", filename_1); 
    fp = fopen(filename_1, "rb"); 

    if(fp) { 
     fseek(fp, 0L, SEEK_END); 
     int sz = (ftell(fp)/3) - 1; 
     fseek(fp, 0L, SEEK_SET); 

     printf("File size: %d\n", sz); 

     int nums[sz][3]; 

     fread(nums,sizeof(int),sz * 3, fp); 

     for (int k = 0; k < sz; k++) { 
      printf("Entry number %d = %d with extra values of %d and %d\n", k, nums[k][0], nums[k][1], nums[k][2]); 
     } 
    } else { 
     printf("Skipping \n"); 
    } 

    fclose(fp); 
} 

我知道這是sprintf的()引起的問題,因爲我簡化了功能:

printf("Please enter file number... \n"); 
scanf("%d%c", &num_file, &term); 

printf("Please enter how many instances in this file... \n"); 
scanf("%d%c", &num_instance, &term); 

int nums[num_instance][3]; 

char format_1[] = "track_%d.bin"; 
char filename_1[sizeof format_1+3]; 
sprintf(filename_1,format_1,num_file); 
printf("Filename: %s \n", filename_1); 

fp = fopen(filename_1, "rb"); 

fread(nums,sizeof(int),num_instance * 3, fp); 
fclose(fp); 

for (int k = 0; k < num_notes; k++) { 
    printf("Entry number %d = %d with extra values of %d and %d\n", k, nums[k][0], nums[k][1], nums[k][2]); 
} 

當我移動的sprintf以上(NUMS的聲明),它工作正常(即使它只是在它上面),只要我移動下面的sprintf NUMS的聲明()輸出看起來象下面這樣:

Entry number: 0 = 71 with extra values 116 and 158 
Entry number: 1 = -1073743712 with extra values -1073744240 and -1073744304 
Entry number: 2 = -1073743896 with extra values 59983 and -1073744005 

正如你可以從上面的代碼片段看,我需要有declarat nums以下的sprintf(),因爲我需要知道文件中的條目數量。

編輯:我想如果我提到一個文件包含多維數組可能會有所幫助:array[x][3]

真的難住這個,任何幫助,非常感謝。

+0

@FredrikPihl C99有VLA。 – 2013-04-03 21:17:55

+0

@FredrikPihl'sizeof format_1 + 3'是一個編譯時間常量。 – 2013-04-03 21:20:59

+1

您需要檢查C中的返回值。這樣您可以準確找到代碼失敗的位置。 – 2013-04-03 21:21:48

回答

2

你的基本問題是,你正在計算文件的大小,以字節爲單位,然後嘗試從文件中讀取多個整數。由於整數是(在大多數機器上)4個字節,這將失敗,並且只能讀入nums陣列的第一個四分之一。其餘的將包含(並打印爲)隨機垃圾,這是你所看到的。

您應該檢查fread的返回值以確保它有意義。如果您將代碼更改爲

int numread = fread(nums,sizeof(int),sz * 3, fp); 
printf("Read %d integers from file\n", numread); 
for (int k = 0; k < sz; k++) { 
    if (k < numread/3) { 
     printf("Entry number %d = %d with extra values of %d and %d\n", k, nums[k][0], nums[k][1], nums[k][2]); 
    } else { 
     printf("Entry number %d doesn't exist in the file\n", k); 
    } 
} 

您會立即看到問題。

總是檢查你的返回值。

+0

感謝您的提示!我想知道如何在@MaximYegorushkin在評論中提到它時檢查返回值。這並不是我遇到的問題,但問題實際上發生在我寫入文件的函數中,我認爲這與我沒有在文件中分配足夠的空間有關。不知道爲什麼它用sprinf()表現這種方式。當我在其他機器上時,我會發布代碼。 – 2013-04-04 08:18:37