2017-01-11 73 views
-1

我需要從文本文件中獲取read a filename。 然後我必須用它作爲fopen的參數。 因此,我需要將它作爲const char*來讀取,因爲這是fopen接受的第一個參數。我該怎麼做呢?如何從文件中讀取const char *

我想是這樣的:

FILE *a; 
a=fopen("a.txt","r"); 
const char *filename 
fgets(filename,100,a); 
image=fopen(filename,"rb"); 

有些事情是錯的,因爲我得到一個分段錯誤當我這樣做。我認爲變量filename不被fopen函數收到。

+3

'const char * filename' - >'char filename [100];'。另外如果'filename'包含換行符,則需要將其刪除。 – BLUEPIXY

+0

我知道代碼是錯誤的,我想知道正確的替代 –

+1

@LazuRazvan我建議你閱讀C中常量('const')的用法。有很多結果只是從谷歌搜索「在C中使用const」 。 –

回答

0

您可能已經看到fopen()需要(const char *)類型的參數,但是您需要能夠在將其傳遞給該函數之前修改該字符串。此外,您需要爲您的字符串分配空間,並且您可能會考慮爲超過100個空間分配空間。 stdio.h頭文件包含宏FILENAME_MAX,它擴展爲一個數組的正確大小的整數常量,該數組將保存系統上最長的文件名字符串。例如,您可以使用char filename[FILENAME_MAX];。當在fopen()的調用中遇到標識符filename時,根據函數原型,它將衰變爲指向char的指針,該指針被轉換爲指向const char的指針。

此外,fgets()保留換行時,如果提取一行文本,所以你需要刪除它。您應該檢查fgets()的結果,因爲它在發生錯誤時返回NULL指針,或者在文件結束時調用該指針;否則返回指向filename[]中第一個char的指針。

FILE *a; 
a=fopen("a.txt","r"); 
char filename[FILENAME_MAX]; 
char *ch; 

ch = fgets(filename,FILENAME_MAX,a); 

/* Remove trailing newline */ 
if (ch) { 
    while (*ch != '\0' && *ch != '\n') { 
     ++ch; 
    } 
    if (*ch == '\n') {     // replace '\n' with '\0' 
     *ch = '\0'; 
    } 
    image=fopen(filename,"rb"); 
} 
0

首先,您的seg故障可能來自嘗試使用您不擁有的內存。即通過創建變量:

const char *filename; 

,而不是試圖使用它之前給它的任何內存([c][m]alloc)。

關於您的聲明:
因此,我需要讀取它作爲一個常量字符*

不一定。
fopen原型的第一個參數:"FILE *fopen(const char *filename, const char *mode)"只是保證在該位置傳遞的參數在fopen函數內將被視爲const char *。 參數可以使用簡單的char *傳遞,例如。下面這些形式:

char *filename = {"somefilename.txt"}; 

char filename[80]; 
strcpy(filename, "somefilename.txt"); 

而且,正如在評論中提到的,和其他的答案,作爲參數傳遞之前刪除換行符,\n