2016-10-24 11 views
-4

私はファイルI/Oの概念をC言語で学びたいと考えています。私はGNU/Linux(Ubuntu 16.04 LTS)を使用しています。私のIDEはeclipse 3.8です。 fprintf()メソッドでファイルに書き込もうとすると、ファイルが作成されないか、ファイルが作成されていても書き込まれません。私はfflush()またはsetbuf(file_pointer, NULL)メソッドを使用して問題を解決しようとしましたが、hereが提案されていますが、変更はありません。私は間違った方法でファイルのアドレスを書いていると思います。ここでubuntuでfprintf()が動作しません

はコードです:

#include <stdio.h> 
int main(void){ 
    FILE *file_pointer; 
    file_pointer=fopen("~/.textsfiless/test.txt","w+"); 
    setbuf(file_pointer,NULL); 
    fprintf(file_pointer,"Testing...\n"); 
    fclose(file_pointer); 
    return EXIT_SUCCESS; 
} 

誰かがここで間違っているかを説明することはできますか?

+0

ファイル 'fopen'の後に' setbuf(file_pointer、NULL); 'を実行する必要があります... – LPs

+3

' fopen() 'の成功を確認するのはなぜですか? –

+4

'fopen'戻り値をチェックしてください。ファイルパスが間違っていると失敗します。 – LPs

答えて

3

fopen()へのお電話が失敗する可能性があります。 fopenが働いていることを確認するためにプログラムをチェックする必要はありません。あなたはパス間違って、間違ったファイルやプロセスの権限をスペルのようにあなたは、関数fopenの戻り値をチェックする必要があり、実際に何が起こったのかを確認するにはなど、

をそれは持っていない可能性があり、これが原因物事の様々な可能性:

#include <stdio.h> 
int main(void){ 
    FILE *file_pointer; 
    file_pointer=fopen("~/.textsfiless/test.txt","w+"); 
    if (file_pointer == NULL) { 
     printf("Opening the file failed."); 
     return EXIT_FAILURE; 
    } 
    setbuf(file_pointer,NULL); 
    fprintf(file_pointer,"Testing...\n"); 
    fclose(file_pointer); 
    return EXIT_SUCCESS; 
} 

編集:あなたのコメントから、あなたのパスが間違っていることが最も確実に起こりました。現在のディレクトリからプログラムを実行していて、ファイルが現在のディレクトリの "textfiless"というフォルダにあり、ファイル名が "test.txt"の場合、

のように fopenを呼び出します。 Linuxの
+0

私が推測したように、私が質問したところでは、私が使ったディレクトリは存在しないようです。しかし、私はいつもこのようなディレクトリを使い、問題はありません。私はファイルディレクトリがここのように見えるのか分からない。 –

+0

@ ErfanKhalaji私はそのことについて私の答えに加えました。 – Magisch

+0

私はあなたがあなたの編集として書いたことをしましたが、それでも変更はありませんでした。 私の質問に投票してもらえますか?私は本当に質問に間違ったものは見つけられませんが、人々は投票していません。 –

4

file_pointer=fopen("/textsfiless/test.txt","w+"); 
~/.textsfiless/test.txt~は、コマンドラインで ~を使用するCライブラリ fopen ...によって拡張されていない、それがによって拡張され、あなたの shell(しかしによって開始された、それを使用してプログラムによって ないシェルはあなたの home directoryexecve(2) ...)を入れます。拡張は globbingと呼ばれます。 glob(7)を読んでください。 ~という名前のディレクトリはほとんどありません。

あなたはfopenは(失敗した可能性が非常に高いです)失敗したのであれば、あなたがチェックする必要がありAdvanced Linux Programming

をお読みください。ホームディレクトリにファイルを取得する場合は、getenv(3)"HOME"(またはおそらくgetpwuid(3) & getuid(2) ...)と使用する方がよいでしょう。

char*homedir = getenv("HOME"); 
if (!homedir) { perror("getenv HOME"); exit(EXIT_FAILURE); }; 
char pathbuf[512]; /// or perhaps PATH_MAX instead of 512 
snprintf(pathbuf, sizeof(pathbuf), 
      "%s/.textsfiless/test.txt", homedir); 
FILE *file_pointer = fopen(pathbuf, "r"); 
if (!file_pointer) { perror(pathbuf); exit(EXIT_FAILURE); }; 

など:おそらくより良いコードがあるかもしれないenviron(7)

を参照してください。

ほとんどの障害に対して、C standard library(& POSIX)の機能を確認する必要があります。 perror(3)関数は、stderrにユーザにエラーを報告するのに便利です。

(pedantically、私たちもsnprintf(3)代わり故障asprintf(3)に対してsizeof(pathbuf)以下の長さを返すか、使用して試験することをテストする必要があり、Iは、読者への課題として、そのテストを残す)を読み取り、より一般的

を使用しているすべての外部機能のdocumentation

(あなたのコードには、おそらくfprintfNULLストリームのストリームがある可能性があります)。すべての警告&デバッグ情報(だからgcc -Wall -g)でコードをコンパイルし、gdbデバッガを使用してください。 What every C programmer should know about undefined behavior.

ご意見は、strace(1)をご覧になり、元の(不良の)プログラムで試してみてください。あなたはそれに使用されるsystem callsについてたくさん学ぶでしょう。

+1

私は質問を削除したいが、私は傾ける。 あなたの答えを削除してください。 –

+1

私の答えを削除する理由はありません。それは複数回upvotedされているので、それは悪くない.... –

関連する問題