2017-01-11 5 views
-1

readfilenameをテキストファイルから取得する必要があります。 次に、fopenの引数として使用する必要があります。 したがって、最初の引数としてfopenが受け入れられるので、const char*と読む必要があります。これはどうすればいいですか?ファイルからconst char *を読み込む方法

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

何かが私はこれを行うとき、私はセグメンテーションフォールトを受け取ると間違っていることである。

は、私のようなものを試してみました。私は変数 filenamefopen機能によってうまく受信されていないと思います。

+3

'const char * filename' - >' char filename [100]; '。'filename'に改行が含まれている場合は、それを削除する必要があります。 – BLUEPIXY

+0

私はコードが間違っていることを知っています、私は正しい代替方法を知りたいです –

+1

@ LazuRazvan私はC言語で定数( 'const')の使用法をお読みになることをお勧めします。 。 –

答えて

0

fopen()は、引数が(const char *)であることがわかりましたが、関数に渡す前に文字列を変更できる必要があります。また、文字列にスペースを割り当てる必要があります。また、100個以上のスペースを割り当てることも検討してください。charstdio.hヘッダーファイルには、FILENAME_MAXというマクロが含まれています。これは、システム上で最も長いファイル名文字列を保持する配列の正しいサイズの整数定数に展開されます。たとえば、char filename[FILENAME_MAX];を使用できます。 fopen()への呼び出しで識別子filenameが発生すると、関数プロトタイプに従ってconst charへのポインタに変換されたcharへのポインタに減衰します。

さらに、fgets()は、改行がテキストの行をフェッチするときに改行を保持するので、削除する必要があります。 fgets()の結果は、エラーが発生した場合にNULLポインタを返すか、ファイルの終わりで呼び出された場合にチェックする必要があります。それ以外の場合は、最初のcharへのポインタをfilename[]に返します。

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フォルトは、自分が所有していないメモリを使用しようとしたことが原因です。すなわち、変数作成することによって:それを使用しようとする前にそれを任意のメモリ([c][m]alloc)を与える

const char *filename; 

をまちません。

ステートメントについて:
したがって、私はそれをconst char *として読む必要があります。

必ずしもそうではありません。
fopenプロトタイプの第1引数:"FILE *fopen(const char *filename, const char *mode)"単にその位置に渡された引数がfopen関数内const char *として扱われることを保証します。 引数は単純なchar *を使用して渡すことができます。これらの形態のいずれか:

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

または

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

そして、コメントで述べたように、そして他の回答には、引数として渡す前に改行文字、\nを削除します。

関連する問題