2013-06-27 144 views
0

我在整個web上搜索了大部分fopen問題,但都無濟於事。我試圖用fopen打開一個文件。以下是我的部分代碼:在c中fopen無法在調試模式下運行

FILE *filep = NULL; 
FILE *Compilation = NULL; 
printf("%s\n", fname); 
char *pfname = (char*)malloc(sizeof(path) + sizeof(fname)); 
pfname = concat(path, fname); 
printf("%s\n", pfname); 
filep = fopen(pfname,"r"); 
if (filep == NULL){ 
     printf("opening file failed: %s\n", strerror(errno)); 
} 
printf("%p\n", filep); 

我使用Visual Studio express 2012作爲我的IDE。當我運行這個沒有調試。它在打印連接的pfname後崩潰。但是,當我在調試模式下運行它時,它工作。 filep不返回NULL,它將打印內存地址。我在printf之後還有另一個fopen,並且在調試模式下它也可以工作。任何人都可以幫助我理解發生了什麼?該文件在那裏,權限是正確的。這是代碼的更新版本,但之前在一些沒有跟蹤的更改之前,fopen工作。 在此先感謝。


修改後的代碼

FILE *filep = NULL; 
FILE *Compilation = NULL; 
printf("%s\n", fname); 
char *pfname = (char*)malloc(strlen(path) + strlen(fname) + 1); 
pfname = concat(path, fname); 
printf("%s\n", pfname); 
filep = fopen(pfname,"r"); 
if (filep == NULL){ 
     printf("opening file failed: %s\n", strerror(errno)); 
} 
printf("%p\n", filep); 
char *newfile = (char*)malloc(strlen(path) + 11); 
newfile = concat(path, "Result.txt"); 
Compilation = fopen(newfile, "a"); 

這依然無法讓過去的fopen,因爲它不打印的指針。

+0

向我們展示'concat()的代碼' – ctn

+0

你從哪裏得到'fname'和'path'的值? –

+0

'sizeof(path)'將是指針的大小,如果path是'char *'類型的話。也許你的意思是'strlen(path)+ strlen(fname)+ 1'。 – ctn

回答

0

問題是這樣的線:

char *pfname = (char*)malloc(sizeof(path) + sizeof(fname)); 

sizeof函數C是數據類型的大小。在這種情況下,數據類型是一個指針(我假設)。所以在32位系統上是4,或者在64位系統上是8。我已經在StackOverflow.com上看到了幾次這種誤解,對於sizeof意味着什麼。

要糾正它,你需要:

char *pfname = (char*)malloc(strlen(path) + strlen(fname) + 1); 

因爲你最終的字符串(即pfname點)必須是兩個字符串的長度,再加上持有的零終止字節。

您現有的線路:

pfname = concat(path, file); 

將覆蓋投入pfname分配的指針。新的文件路徑,應計算如下:

strcpy(pfname, path); // Copy the path to the newly allocated file path buffer 
strcat(pfname, file); // Concatenate the file name to the path 

我假設path在需要的目錄定界符字符結束。否則,需要通過爲pfname分配一個附加字符並連接\來計算。

相同的邏輯將應用於您的後續文件編譯邏輯。

+0

我剛剛實施它。這次fopen返回NULL,這是因爲路徑不以\結束,而fname不以\開頭。爲了解決這個問題,我添加了一個額外的'strcat(pfname,「\\」);'但是這又讓程序崩潰了。這縮小了問題的範圍。我在最後添加了2到我的pfname的malloc而不是1。謝謝mbratch的幫助 – user2127579

+0

@ user2127579聽起來不錯。 :) – lurker

+0

現在代碼實際上停止在'if(if('filep == NULL){''斷點到'res = _heap_alloc(size)'的線上malloc.c' – user2127579

0

使用sizeof()來確定所需的空間爲pfname是錯誤的我猜。我應該有pathfname的聲明,但是要麼他們是指針,那麼你會得到指針大小(4或8)或者他們是數組,那麼你會得到完整的數組大小。改爲使用malloc(strlen(path)+strlen(fname)+1)

相關問題