[解決済み] c で pread() による読み込みと pwrite() による書き込み
2022-02-12 20:02:32
質問内容
私のプログラム(以下)では pwrite() ) テキストをファイルに書き出し、( プレアド() を使用します。私の問題は、pread関数がファイルからテキストを読み取らないことと、close関数(プログラムの最後の部分)に問題があることです。結果は2番目の部分にあります。私の間違いはどこにあるのでしょうか?
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <sys/stat.h>
#include <sys/types.h>
int main()
{
int fd, nr, nr2, nw, nw2;
char fl_nm[]={"file_io/pwrite.txt"};
char buf_wr[]={"hello everyone this is first text\n"};
char buf_wr2[]={"Did you miss me? Don't afraid\n"};
char buf_rd[120];
char buf_rd2[120];
//open file
fd = open(fl_nm, O_RDWR|O_CREAT, 0777);
nw = pwrite(fd, &buf_wr, strlen(buf_wr), 14);
//error checking
if(fd == -1){
perror("[error in open]\n");
}
else if(nw == -1){
perror("[error in write]\n");
}
else{
/*if open and write process are okey, read first write data
* from file*/
nr = read(fd, &buf_rd, sizeof(buf_rd));
//display succeeded message about first write and open process
printf("[file is opened]\n");
printf("[succeeded write(1) process]\n");
//read process error control
if(nr == -1){
perror("[error in read]\n");
} else{
printf("[reading(1) data] from %s\n", fl_nm);
printf("[%s]\n", buf_rd);
}
}
//second write process.
nw2= pwrite(fd, &buf_wr2, strlen(buf_wr2), 30);
//write error checking
if(nw2 == -1){
perror("[error in write 2]\n");
}else{
/*if write process is correct
* second read process*/
nr2 = read(fd, &buf_rd2, sizeof(buf_rd));
printf("-----------------------------------\n");
printf("[succeeded write(2) process]\n");
printf("[reading(2) data] from %s\n", fl_nm);
printf("[%s]\n", buf_rd2);
}
//close file
close(fd);
//error checking for close process
if(close(fd) == -1){
perror("[error in close]\n");
}else{
printf("[succeeded in close]\n");
}
return 0;
}
結果
$ gcc pwrite.c -o pwrite
$ ./pwrite
[file is opened]
[succeeded write(1) process]
[reading(1) data] from file_io/pwrite.txt
[]
-----------------------------------
[succeeded write(2) process]
[reading(2) data] from file_io/pwrite.txt
[]
[error in close]
: Bad file descriptor
解決方法は?
1)
close()
は、ファイルを閉じているため失敗します。
2回
:
//close file
close(fd);
//error check close process
if(close(fd) == -1){
を最初に呼び出した後
close(fd);
,
fd
が不定になり、2回目の呼び出しで
close(fd)
は失敗します。への最初の呼び出しを削除すればよいのです。
close(fd);
.
2) 印刷している
buf_rd
をC文字列であるかのように表現しています。
read()
が終了するわけではありません。
buf_rd
をヌルバイトで返す。
3) ランダムなオフセット(14と30)に書き込む場合
pwrite()
. しかし
read()
は現在のオフセットから読み取るので、開始バイトがヌルバイトになる可能性があり、そのため
%s
はすぐに印刷を停止します(つまり、何も印刷しません)。書いてあることよりもたくさん読んでいることになります。つまり
read()
は要求されたバイト数よりも少ないバイト数を返そうとします。そのため、返り値として
read()
を使用して、読み取りに成功したバイト数を取得します。
代わりに、ループを使って各バイトを表示します。
for (size_t l = 0; l < nr; l++)
printf("%c", buf_rd[l]);
そして
for (size_t l = 0; l < nr2; l++)
printf("%c", buf_rd2[l]);
関連
-
[解決済み】「ポインタから異なるサイズの整数へのキャスト」エラーが発生するのはなぜですか?
-
[解決済み】fgetsによるセグメンテーションフォールト(コアダンプ) - と思う。
-
[解決済み】argv[]をint型として取得するには?
-
[解決済み】C言語で入力が整数型かどうかチェックする
-
[解決済み】MPI通信でMPI_Bcastを使用する場合
-
[解決済み] 1ビットのセット、クリア、トグルはどのように行うのですか?
-
[解決済み] ワイルドカードマッチングに基づいて、現在のフォルダとサブフォルダ内のすべてのファイルを再帰的に検索するにはどうすればよいですか?
-
[解決済み] フォルダとそのサブフォルダ/ファイルのパーミッションを一括で変更する方法
-
[解決済み] プロセスとスレッドの違いは何ですか?
-
[解決済み] 配列の場合、なぜ a[5] == 5[a] になるのでしょうか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Cコンパイルエラー。"変数サイズのオブジェクトが初期化されていない可能性がある"
-
[解決済み】LEALアセンブリ命令は何をするのですか?
-
[解決済み】C言語でint64_t型を表示する方法
-
[解決済み] [Solved] .Cファイルをコンパイルしています。アーキテクチャ x86_64 の未定義シンボル
-
[解決済み】エラー:不明な型名'bool'
-
[解決済み】int型配列へのポインタのスカラ・イニシャライザの過剰要素
-
[解決済み】C言語のフォーマット文字列でデータ引数が使用されない [重複]。
-
[解決済み】エラー:呼び出されたオブジェクトは、関数または関数ポインタではない
-
[解決済み】.axfファイルとは何ですか?
-
[解決済み】Errno: 11, Resource Temporarily Unavailable(リソースが一時的に利用できない