低水準出力の問題
Posted: 2011年11月10日(木) 08:40
しばらく考えているのですがどうしても分からないのでよろしくお願いします。
低水準でopen したファイル(diskfile)にwriteし、ふたたびその書き出したファイルからreadするプログラム、を書いているのですが、writeでファイルに書き出したファイルからreadができません。
手順としては、
openでファイル(diskfile)を作成/オープン。
writeでファイルに書き込む。
それを再びreadによりバッファー(readBuffer)に入れ、標準出力に書き出す。<= ここでのreadでうまくファイルの中身をバッファーに書き込めません。
よろしくお願いします。
main.c
p242pio.h
低水準でopen したファイル(diskfile)にwriteし、ふたたびその書き出したファイルからreadするプログラム、を書いているのですが、writeでファイルに書き出したファイルからreadができません。
手順としては、
openでファイル(diskfile)を作成/オープン。
writeでファイルに書き込む。
それを再びreadによりバッファー(readBuffer)に入れ、標準出力に書き出す。<= ここでのreadでうまくファイルの中身をバッファーに書き込めません。
よろしくお願いします。
main.c
#include "p242pio.h"
int main (int argc, const char * argv[]) {
int fd,wt,readSize,id;
void *readBuffer = (void*)calloc(10, 1024);
char strbuff[50];
id = 1;
sprintf(strbuff, "Write by fd %d", id);
fd = openDisk("diskfile", 10*1024);
wt = writeBlock(fd, id, (void*)strbuff);
printf("fd %d wrote size of %d byte, data written: %s\n", fd, wt, (char*)strbuff);
while (1) {
readSize = readBlock(fd, id, readBuffer);
printf("Read fd %d read size of %d byte ,data read: %s\n", fd,readSize,(char*)readBuffer);
if ( readSize > 0 ){
printf("readSize = %d\n",readSize);
write(1, readBuffer, readSize);
} else if ( readSize == 0 ){
break;
}
}
return 0;
}
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <string.h>
#include <errno.h>
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <pthread.h>
int openDisk(char* filename, int nbytes){
int diskNo;
diskNo = open(filename, O_RDWR|O_CREAT, S_IREAD|S_IWRITE);
if ( diskNo == -1 ){
printf("file open/create error\n");
switch ( errno ){
case EACCES :
printf("ファイル名に既存の読み出し専用ファイルを指定したか、");
printf("またはファイルではなくディレクトリを指定しています。 \n");
break;
case EMFILE :
printf("開いているファイルが多すぎます\n");
break;
}
return 0;
}else {
printf("nbyte = %d byte\n", nbytes);
ftruncate(diskNo, nbytes);
}
return diskNo;
}
int readBlock(int disk, int blocknr, void *block){
int rs;
int buf[256];
rs = read(disk, block, sizeof(buf));
if ( rs == -1 ){
printf("read error\n");
}
return rs;
}
int writeBlock(int disk, int blocknr, void *block){
int ws;
ws = write(disk,block,strlen(block));
if (ws == -1) {
printf("write error\n");
}
return ws;
}