2012-11-27 16 views
0

我試圖讀取多個文件。該文件的格式將類似於YYYY-mm-dd-HH-MM.txt和例如2012-11-26-18-50.txtC - 使用sprintf讀取文件

東西,我有以下代碼

char text_buffer[1000]; 
char file_buffer[256]; 
int year, month, day, hour, minute; 
year = 2012; month = 11; day = 26; hour = 18; minute = 0; 

sprintf(file_buffer, "%d-%d-%d-%d-%d.txt", year, month,day,hour,minute); 
FILE *ptr_file; 
ptr_file=fopen(file_buffer, "r"); 
if(ptr_file != NULL) 
    printf("File opened %s for reading.\n", file_buffer); 
else 
    printf("Couldn't open %s.\n", file_buffer); 

line_number = 0; 
while(fgets(buffer,sizeof(buffer), ptr_file) != NULL){ 
    if(strcmp(buffer, "")==0) 
     return 0; 
    char *views = strok(buffer, ","); 
... 
} 

我假定這就是所需要的所有信息。如果現在還不清楚我的問題在哪裏,我會將其全部發布。 當我運行程序。我同時獲得 Filed opened...Couldn't open...。然後是分段錯誤。

有人可以幫我解決這個問題嗎?

謝謝。

+0

你想通過sprintf()調用來實現什麼?你想創建一個文件名? – Marvo

+2

實際上,對sprintf()的調用將嘗試寫入由file_buffer指向的內存位置,並且您尚未初始化它。所以會出現分段錯誤或其他錯誤。 – Marvo

+0

文件是否真的存在? –

回答

3

首先,你要確保你做的東西(也許返回錯誤代碼),當您無法打開該文件。嘗試從NULL FILE *讀取時會發生分段錯誤。

此外,由於file_buffer是指針而不是緩衝區,因此您正在破壞內存。你需要初始化它。最後,你要確保你關閉你打開的文件。

我也假設你在某處定義緩衝區。在你的代碼示例中,我沒有看到定義。也許你打算使用text_buffer來代替?

如果您正在使用LINUX處理這些類型的內存損壞,我會推薦兩種工具。

  1. GDB,在程序中逐行執行並檢查變量。
  2. Valgrind,它會讓你知道這個簡單的內存損壞。

這兩個工具,一旦你精通它們,可以幫助消除最簡單的編程錯誤。

1

file_buffer從不初始化,它可以指向任何地方。你可能想是這樣的:的

char file_buffer[PATH_MAX+1]; 

代替

char *file_buffer; 
+1

我將它改爲'char buffer [512];'並且仍然得到相同的錯誤。 – user1709294

0

你沒有任何地方初始化file_buffer變量。

你應該初始化它作爲

char file_buffer[256]; 
0

格式打印日期和時間,例如%02d,因爲它們可能每個都包含1-2位數字。

+0

這應該是原始問題中的評論。 –

+0

@Burgos:我在想他得到'Opened file'和'Could not open'信息的原因是,正如他所說,他正在讀取多個文件,其中一些文件成功了,一些不是因爲文件名格式不同 –

+0

是的,這很合理,對不起! –