###前提・実現したいこと
C言語で open(2), close(2), read(2) 等を用いて(標準入出力ライブラリ関数を使わず)ファイルから1文字ずつ読み出すプログラムを作ろうとしています。
###発生している問題・エラーメッセージ
abcという中身のファイルを読み出すと65、66、67、aと出てしまいます。 myfgetcかmyfopenが怪しいと思うのですが、どこをどう直して良いかわかりません。
###該当のソースコード
C言語
1#include <stdio.h> 2#include <unistd.h> 3#include <fcntl.h> 4 5// バッファーサイズ 6// 動作確認しやすくするため小さめの値とする 7enum { 8 BUFFERSIZE = 5 9}; 10 11typedef struct myfile { 12 int fd; 13 int count; 14 int pointer; 15 unsigned char buffer[BUFFERSIZE]; 16} MYFILE; 17 18// 簡単化のため同時にオープンできるファイルは1個だけ 19static MYFILE myfile; 20 21void print_myfile (MYFILE *fp) { 22 int i; 23 if (fp) { 24 fprintf (stderr, "[MYFILE] fd:%d c:%d p:%d ", 25 fp->fd, fp->count, fp->pointer); 26 for (i = 0; i < BUFFERSIZE; i ++) { 27 fprintf (stderr, " %02x", fp->buffer[i]); 28 } 29 fputc ('\n', stderr); 30 } 31} 32 33MYFILE *myfopen (char *filename) { 34 // 35 // この部分を作成する 36 // 37 // 与えられたファイル名のファイルを開く 38 int fp = open(filename, O_RDWR); 39 myfile.fd = fp; 40 myfile.count = 0; 41 myfile.pointer = fp; 42 // http://www5c.biglobe.ne.jp/~ecb/c/13_09.html 43 // fdopen(fp, r+) 44 return &myfile; 45} 46 47int myfclose (MYFILE *fp) { 48 // 49 // この部分を作成する 50 // 51 close (fp->fd); 52 return 0; 53} 54 55int myfgetc (MYFILE *fp) { 56 // 57 // この部分を作成する 58 // 1文字読み込み、その文字を返します 59 60 int readCount = fp->count; 61 fp->count += 1; 62 if (fp->count < BUFFERSIZE) { 63 read(fp->fd, fp->buffer, 1); 64 return (int)*(fp->buffer + readCount); 65 } else { 66 return EOF; 67 } 68} 69 70int main (int argc, char *argv[]) { 71 char *filename = "abc.txt"; 72 MYFILE *fp; 73 int c; 74 if (argc == 2) filename = argv[1]; 75 fp = myfopen (filename); 76 if (fp) { 77 print_myfile (fp); 78 while ((c = myfgetc (fp)) != EOF) { 79 printf ("#[%02x]%c#\n", c, c); 80 print_myfile (fp); 81 } 82 print_myfile (fp); 83 myfclose (fp); 84 return 0; 85 } else { 86 return 1; 87 } 88} 89
###試したこと
課題に対してアプローチしたことを記載してください
// この部分を作成する、と書かれた関数は自作して何とか動作までは漕ぎ着けました。
ただ、openやread、バッファリングなどの仕組みについて理解が足りないようで、正常に開けていない或いは正常に読み込めていません。
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2016/11/03 09:14