2016-11-04 18 views
0

ユーザーからの文字列入力を読み込んでファイルに書きたいと思っています。今、私はC - ユーザー入力を動的文字配列に格納していますか?

char name[25]; 
scanf("%s", name); 
int handle = open("./visitors.txt", O_RDWR|O_CREAT, S_IRUSR|S_IWUSR); 
if (handle < 0){ 
    printf("File error.\n"); 
    return; 
} 
lseek(handle, -sizeof(name), SEEK_END); 
write(handle, name, sizeof(name)); 

これをやっている、もちろん、ほとんどの時間は、ユーザが25文字、唯一のあまりの書き込みがないので、右ではないので、ときユーザ入力5つの文字、他の20の意志空でなければなりません。私はユーザーが入れた5文字と出力ファイルに20文字のばかげた文字を持つことになります。ユーザー入力のみがファイルに書き込まれていることを確認するにはどうすればよいですか?

+0

'scanf'のマニュアルを読んでいますか? '%s'は出力をヌル終了させます。 –

+0

'-sizeof(name)'は ' - (off_t)sizeof(name)'でなければなりません。 –

+0

@ M.M違いはありません。 –

答えて

1

ファイル操作を処理するために生システムコールを使用しています。あなたの意図が特にシステムコールについて学ぶことでない限り、あなたはそれを行うべきではありません。 The write callは、3番目のパラメータで指定されたバイト数を書き込みます。この場合はsizeof(name)が間違っています。 ではないは、文字列の長さを返します、それはバッファ全体の長さを返します。

標準strlen functionは、文字列の長さを示します。したがって、strlen(name)を実行すると、使用しているsizeofとは異なり、ユーザーが5文字を入力すると5が表示されます。

具体的には、Cの標準ライブラリでファイル操作を処理し、fprintfを使用してファイルに出力し、fopenfcloseなどの関数を処理する必要があります。ほかの機能にもリンクしているat the fprintf docsを見てください。

+0

それはそれでした! 'sizeof()'の代わりに 'strlen()'を使って修正しました。ありがとうございました! –

1

低レベルのシステムコールを使用する理由がわかりませんopenlseekwrite通常、標準的なC fopen,fscanffprintfのようなタスクを使用する方がはるかに便利です。この場合

、あなたがしてファイルに書き込む%sfprintfを使用し、stdinから文字列の入力を取得するfgetsをしようとします。バッファname[25]またはname[100](最大入力はstdin)を使用できます。それを正しく初期化して、NULLで終了することを確認してください。その後、fprintf%sとすると、正しく文字列を書き込むことになります。

+0

バッファがヌル終了していることを確認する方法を教えてください。 –

+0

'char name [25] =" ""; – artm

+0

ループで 'name'を使用する必要がある場合は' memset'をループの先頭にすべて0にします – artm

関連する問題