フラッシュメモリやハードディスクへファイルの書き出しをfwriteで行い、
作成したファイルをfreadを使って読み込み、その前後でclock関数を呼ぶことで
読み書きの処理時間を算出するプログラムを作成しています。
具体的には以下のような処理を行わせています。


//書き込み用のバッファを作成
buf_w = (unsigned char*)malloc(BUFSIZE);
memset(buf,0,BUFSIZE);
//ファイル書き込み処理
fp = fopen("ファイル名","wb");
start = clock();
fwrite(buf_w,BUFSIZE,1,fp);
end = clock();
fclose(fp);


//読み出し用のバッファを作成
buf_r = (unsigned char*)malloc(BUFSIZE);
//ファイル読み出し処理
fp = fopen("ファイル名","rb");
start = clock();
fread(buf,BUFSIZE,1,fp);
end = clock();
fclose(fp);


以上の処理にて、BUFSIZEが1GB程度の場合は問題ないのですが、
BUFSIZEを200MB程度に減らした場合に読み込み速度が
ありえないほど速くなってしまうという問題が発生してしまいます。
(HDDやフラッシュメモリからの読み込みなのに転送速度が1000MB/sオーバーとか)

RAMDISKとして設置したXドライブで試すと読み書き共に1200MB/sくらいになるので、
もしかしたらメモリにキャッシュされたデータを直接読み込んでしまっているのでは……
などと考えているのですが、試行錯誤すれども回避策が思い浮かびません。

どなたか、この現象について心当たりのある方がいらっしゃいましたら何かアドバイスいただけると幸いです。
宜しくお願いいたします。

このQ&Aに関連する最新のQ&A

A 回答 (1件)

こういう目的でfreadのような高水準I/O関数使うと正確な結果は得られません。



WindowsならWinAPI,Linuxならシステムコール使い、
キャッシュを使用しない設定でファイルを開いて読み書きすれば、それなりに安定したデータが得られると思います。

あと一回で1GBもメモリ確保したらスラッシングが起きてませんかね?
これも結果を不正確にする要素なのでもう少し小さいサイズ(20MB位)から始めた方がいいです。
    • good
    • 0
この回答へのお礼

ご回答有難うございます。

やはり低水準入出力使わないと駄目でしたか……
Linuxのシステムコールは若干経験があったのですが、WindowsではWINAPIを使えば良かったのですね。キャッシュを無効にして読み出す方法がある事を知り大変勉強になりました。

ご指摘の通り、WIN32APIのCREATE_FILEでFILE_FLAG_NO_BUFFERINGのフラグを立てて読み出しを行ったところ、ほぼ正確な値を得ることができました。
悩んでいた事を解決できすっきりしました。

メモリ確保容量も確かに1GBはどう考えてもまずいですよね。こちらも再考してみます。有難うございました。

お礼日時:2008/10/23 23:09

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

QC言語でファイル読み書きを早くしたい。

いつも利用させてもらって助かっています。

あるプログラムを作成しているのですが、ファイル入力の部分がネックとなってしまって、全体が使いものにならない状況に陥っています。
たくさんのデータをfread1回で読み込むことにより、読み込み速度はずいぶんと改善されましたが、まだ圧倒的に遅い状況です。システムコールを使いましたが、ほとんど改善されませんでした。
読み込み/書き込みの速度を改善する方法として,SSDメモリを使ったりする方法があると思いますが,プログラムの観点から改善できるところはないでしょうか?
下に、ファイル読み込みの部分だけ記述したコードを添付させて頂いたので、改善できる点があれば、御指摘頂けると助かります。

なお、前提として,
(1)データはスタック領域だと不足するので、ヒープ領域に確保
(2)データファイルは改行無しの一連のデータ
とします。

ちなみに、環境は
OS   : CentOS5.3
memory   : 6GB
コンパイラ : gcc
です。

よろしくお願いします。

//-----------------------------------------------------
//通常バージョン
#include <stdio.h>
#include <stdlib.h>

#define SIZE (512*1024*1024) //500MB

int main(void)
{
unsigned long int i;
unsigned char *data;
FILE *fp;

data = (unsigned char *)malloc(SIZE);
if(data == NULL) {
printf("メモリが確保できません\n");
exit(EXIT_FAILURE);
}

fp = fopen("filein.dat", "rb");
fread( data, sizeof( unsigned char), (int)SIZE, fp );
fclose(fp);

/*
//表示
for( i=0; i<SIZE; i++ ){
printf("%2x", data[i]);
}
puts("");
*/

fp = fopen("fileout.dat", "w");
fwrite( data, sizeof( unsigned char), (int)SIZE, fp);
fclose(fp);

free(data);
return 0;
}

//-----------------------------------------------------
//readシステムコールを使ったバージョン
#include <stdio.h>
#include <stdlib.h>

#define SIZE (512*1024*1024) //500MB

int main(void)
{
unsigned long int i;
unsigned char *data;

data = (unsigned char *)malloc(SIZE);
if(data == NULL) {
printf("メモリが確保できません\n");
exit(EXIT_FAILURE);
}

int fd;
fd = open( "filein.dat" );
read( fd, data, sizeof(unsigned char)*SIZE);
close(fd);

/*
//表示
for( i=0; i<SIZE; i++ ){
printf("%2x", data[i]);
}
puts("");
*/

FILE *fp;
fp = fopen("fileout.dat", "w");
fwrite( data, sizeof( unsigned char), (int)SIZE, fp);
fclose(fp);

free(data);
return 0;
}

いつも利用させてもらって助かっています。

あるプログラムを作成しているのですが、ファイル入力の部分がネックとなってしまって、全体が使いものにならない状況に陥っています。
たくさんのデータをfread1回で読み込むことにより、読み込み速度はずいぶんと改善されましたが、まだ圧倒的に遅い状況です。システムコールを使いましたが、ほとんど改善されませんでした。
読み込み/書き込みの速度を改善する方法として,SSDメモリを使ったりする方法があると思いますが,プログラムの観点から改善できるとこ...続きを読む

Aベストアンサー

>「まだ圧倒的に遅い状況」と申し上げましたのは、
>全体の処理に対してファイルの読み書きが占める割合が
>50%以上を占めてしまっている、ということです。

ディスク入出力処理に時間がかかるコト、そんなにおかしいですかね。
入出力に時間がかかるのは、常識だと思うのですが。
入出力性能要件を全体処理に対する割合で算出することがナンセンスに思えます。

確認なんですが、質問タイトルは「読み書きを早くしたい」、
本文は「ファイル入力の部分がネックとなってしまって」
とありますが、問題視されているのは、読み込みですか?
>500MB / 0.256s = 1953MB/s ≒ 1.9GB/s

500MBを0.256秒で読み込めているのが異常に速くて、にわかには信じがたいです。
OSがファイルをキャッシュして、メモリ上に蓄えてるんじゃないですか?

>ちなみに、RAMディスク
キャッシュ vs RAMディスクだとすると、どちらも同じRAM上なので、
速度は同程度になるような気がします。
PCを再起動して1回目の計測だと10秒ぐらいかかったりしませんか?

読み込み速度の基準は、デバイスのベンチマークテストなどを行って、
それを基準にしたほうがいいと思います。

>「まだ圧倒的に遅い状況」と申し上げましたのは、
>全体の処理に対してファイルの読み書きが占める割合が
>50%以上を占めてしまっている、ということです。

ディスク入出力処理に時間がかかるコト、そんなにおかしいですかね。
入出力に時間がかかるのは、常識だと思うのですが。
入出力性能要件を全体処理に対する割合で算出することがナンセンスに思えます。

確認なんですが、質問タイトルは「読み書きを早くしたい」、
本文は「ファイル入力の部分がネックとなってしまって」
とありますが、問題...続きを読む

Qfreadでデータがない場合の読込値は?

あるバイナリデータからデータを読み込んでいます。

全てデータを読み込んだら、データの読み込みを終了させたいと考えています。

データの読み込んでいき、最後のデータの読み込み終了後、さらにデータを読み込むと\0を読み込むと考えたのですが、間違いでしょうか?
do~while();文を使った場合、()内には何を代入したらいいですか?

どうしてもわからなくて困っております.
ご存知の方がいましたら教えていただけないでしょうか?
よろしくお願いいたします.

Aベストアンサー

>データの読み込んでいき、最後のデータの読み込み終了後、さらにデータを読み込むと\0を読み込むと
>考えたのですが、間違いでしょうか?
最後に\0は読み込まれません。
freadは読み込んだ要素の数を返します。要素のサイズが1の場合は、読み込んだバイト数が返ることに
なります。そうすると、戻り値が0の場合が、読み込みの終わりと判断することになるのですが、
読み込み時、エラーがあった場合も、freadは0を返します。つまり、エラーなのかファイル終端なのかは、freadの戻り値だけでは、判断できません。従って、その後、feofを呼び出し、ファイル終端に達しているかを確認します。ファイル終端なら、正常終了、そうでないならエラーが発生していると、判断します。


>do~while();文を使った場合、()内には何を代入したらいいですか?
do whileでは難しいです。while(1)を使用したほうが、簡単に作れます。

上記を踏まえて、作成したサンプルが、以下の内容です。
ファイル名をsample.cとして、プログラムsampleを作成後、
sample xxx
(xxxは読み込みたいファイル名)とすると、
毎回、読み込んだファイルのサイズを出力し、正常であれば「正常終了」
が、表示されます。
-----------------------------------
#include <stdio.h>
#include <errno.h>
int main(int argc , char *argv[])
{
FILE*fp;
size_trsize;
intret;
charbuff[256];
if (argc != 2){
printf ("%s ファイル名\n",argv[0]);
return 0;
}
fp = fopen(argv[1],"rb");
if (fp == NULL){
printf("ファイルオープン失敗:errno=%d\n",errno);
return 10;
}
while(1){
rsize = fread(buff,1,sizeof(buff),fp);
//読み込んだ要素数が0なら終了
//但し、これはエラーが発生したから0なのか、ファイル終端に達したから0なのかを
//区別できない(freadの仕様のため)
if (rsize == 0) break;
//とにかく正常に読めたので、その処理をおこなう。
//読み込んだサイズはrsizeバイトである
//rsizeの内容を印字して、処理とする(実際の処理は質問者が実装する)
printf("rsize=%d\n",rsize);
}
//breakから抜けたとき、ファイル終端に達していることを確認する
if (feof(fp) == 0){
//ファイル終端に達していない、つまり何らかのエラーがあった
printf("ファイル読み込み失敗:errno=%d\n",errno);
//既にエラーが起こっているのでfcloseのエラーはチェックしない
fclose(fp);
return 10;
}
ret = fclose(fp);
if (ret != 0){
printf("ファイルクローズ失敗:errno=%d\n",errno);
return 10;
}
printf("正常終了\n");
return 0;
}

------------------------------------

>データの読み込んでいき、最後のデータの読み込み終了後、さらにデータを読み込むと\0を読み込むと
>考えたのですが、間違いでしょうか?
最後に\0は読み込まれません。
freadは読み込んだ要素の数を返します。要素のサイズが1の場合は、読み込んだバイト数が返ることに
なります。そうすると、戻り値が0の場合が、読み込みの終わりと判断することになるのですが、
読み込み時、エラーがあった場合も、freadは0を返します。つまり、エラーなのかファイル終端なのかは、freadの戻り値だけでは、判断できません...続きを読む

Qint型からchar型への変換

タイトル通り、int型からchar型への変換の仕方がわかりません!><
どうしたらいいのでしょうか?

Aベストアンサー

#include <stdio.h>


char buf[5];
int no;

no = 10;
sprintf(buf, "%d", no);

Qsocket: recvはいつ,どれだけ受け取るのか?

 現在,参考書にしたがってC++でソケットプログラミングを書いています.

 sendとrecvを非同期にするために,本では select関数やWSAAsyncSelect関数などを利用していて,実際,本のとおりに書いて上手く動いています.

 ここで伺いたいのですが,recvは,どうやって「データが届いたか」を知るのでしょうか.

 同期ならば,トランシーバでの会話のように送信側が「どうぞ」といって送受信を交代させることができますが,非同期ならばそれができません.

 NICとかが,プログラムに「届いたぞ!( or これから届くぞ!)」と教えてくれるのでしょうか.あるいは逆に,プログラムがNICに「届いてる?」と聞いているのでしょうか.仮に,ここに書いたような方法で届いたことが分かったとしても,どれくらい受け取ればいいかは分かりません(それも併せて教えてもらっているのでしょうか.データを送るときには,どれだけ送ればいいか分かりますよね.受信するときはどうしてるのかを知りたいと思っています).

Aベストアンサー

Linux しか知らないので Linux で説明をします。

NIC が通信パケットを受け取ると割り込みが発生し、CPU は割り込みを受け付けて、対応するデバイスドライバを起動します。この時、ドライバはソケットバッファと呼ばれる構造体にパケットの中身をコピーして、Linux カーネルの本体に渡し、そこで TCP 等の上位プロトコル処理が行われます。

一方、ユーザプログラムの方は、 select() なり read() で待っている訳ですが、OS はもちろんプロセスが何を待っているかを知っているので、対応する待ちの条件が満たされると、この場合は select() や read() が、抜けてくる(return する)訳です。

という事で、ユーザのプログラムは select() なり read() なりで受信データを「待つ」ことが必要です。もちろん select() や read() が呼ばれた時点で既に受信しているのならば、それらは直ぐに帰ってきます。read() や recv() はデータが届いた事を知る、というよりは、届いているかチェックして、まだ届いていなければ届くまで待つ(read() が抜けてこない)という処理になります。また NIC とユーザプログラムが直接やり取りをするのではなく、間にバッファがあって、対応するソケットのデータがある(受信済み)/ないか(未受信)、という問い合わせを行っているだけです。

ソケットの場合、データの送受信は非同期であり、送受信のタイミングのずれは(ソケット)バッファである程度吸収されます。もちろん、送受信バッファが満杯になった場合は流量制御が働いて、結果的に送信側の write() や send() が待ちに入ることになります。

Linux (Unix) のソケットの受信では、read() 等で指定されたバッファが常に満杯で返されるとは限らない設計になっています。つまり、その時に受信しているデータを返すだけなので、read() で返されたバイト数を必ず見ないと間違った動きになるので注意してください。

Linux しか知らないので Linux で説明をします。

NIC が通信パケットを受け取ると割り込みが発生し、CPU は割り込みを受け付けて、対応するデバイスドライバを起動します。この時、ドライバはソケットバッファと呼ばれる構造体にパケットの中身をコピーして、Linux カーネルの本体に渡し、そこで TCP 等の上位プロトコル処理が行われます。

一方、ユーザプログラムの方は、 select() なり read() で待っている訳ですが、OS はもちろんプロセスが何を待っているかを知っているので、対応する待ちの条件が満...続きを読む

Qファイルやディレクトリの存在確認を行う方法

ファイルをオープンするのはfopenでOKですが、ファイルやディレクトリの存在確認を行う方法が知りたいです。

何か組み合わせて作るものなのでしょうか?
perlとか便利な演算子があるのですが、C/C++って器用ではないですね。
これは処理系?依存の内容ですか?

私の環境は VC6, VC2005 Windows2000です。

Aベストアンサー

int access(const char* path, int mode);
int stat(const char* path, struct stat* sb);

かな?
MSDN を引くと _access_s() を使えとか書いてあるけど。

Qfread()関数とfwrite()関数について

fread(void *バッファ,site_t サイズ,size_t 数値,FILE *ストリーム)のようなものがありますが「サイズ」と「数値」とはどのように求めるのでしょうか。
あと、void型のポインタのことがわかりません。

Aベストアンサー

例えば
char data[100] ;
とした data 全部をfreadで読む/fwriteで書く場合

バッファはdataの先頭なので data でいいです。型をあわせるために (void *)data と書いてもよいでしょう。
サイズは data の一個一個の大きさです。char型なので sizeof(char) になります。
数値はその個数なので、宣言から 100 になります。

例えば
int data2[1000];
の200番目から30個に読み込むなら
fread( & ( data2[200] ) , sizeof(int), 30 , fp );
ですし
short s ;
に読みこむなら、sの領域に1個読み込む、と考えて
fread( &s , sizeof(short), 1, fp );
です。

Qunsigned long long 型のフォーマット指定子

unsigned long long 型の変数の値を表示したいのですが、
フォーマット指定子は%ldですか?
よろしくおねがいします。

Aベストアンサー

規格上は、%llu のように ll を付けます。(unsigned long longなので、%lld ではなく %llu です。)
ただし、C99に準拠した処理系ではなく、単に独自拡張としてlong long型をサポートしている場合には、%Lu とか %qu とかになる場合もあります。場合によっては、long long型が存在する処理系でも、printf系関数で正しく書式化する方法が存在しないこともあり得ます。

QLNK2019: 未解決の外部シンボルのエラーが出る

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自キャラのデータ
Point2D g_jikipos = {40, 400};//自キャラの座標

//画像ハンドル
int g_jikiimage[11];

//色々なファイルの読み込み
int LoadFiles(){
//画像ファイル読み込み
if(LoadDivGraph("media\\player01.bmp",
11,11,1,64,64,g_jikiimage) == -1) return -1;

return 1;
}


 mymain.h
//他から呼び出させるMyMainの関数
void MyMain();
int LoadFiles();


 myhelper.h(サンプルなので打ちミスはない)
#include "DxLib.h"
#include <limits.h>
#include <math.h>

//構造体宣言
//座標またはベクトルを記録する構造体
struct Vector{
float x,y;
};
typedef Vector Point2D;
//線を記録する構造体
struct Line2D{
Point2D startpos, endpos;
float katamuki;//傾きをラジアン値で記録
Vector speed;//移動している場合は速度をセット
};
//球体を記録する構造体
struct Ball2D{
Point2D position;
float hankei;//半径
};
//四角形を記録する構造体
struct Rect2D{
Point2D lefttop;
Point2D rightbottom;
float width;
float height;
};


//ライブラリ関数
Point2D PosInView(Point2D in);
int XInView(float inx);
int YInView(float iny);
void ScrollToLeft(float jikiposx);
void ScrollToRight(float jikiposx);
void ScrollToUp(float jikiposy);
void ScrollToDown(float jikiposy);
void DrawLineInView(float x1, float y1, float x2, float y2, int Color, int Thickness);
void DrawCircleInView(float x, float y, float r, int Color, int FillFlag);
void DrawAnimation(float x, float y, double ExtRate, double Angle,int TurnFlag,
int *imgarray, int allframe, float fps);
//ベクトル関数
Vector CreateVector(Vector in, float veclen);
Vector AddVector(Vector v1, Vector v2);
Vector SubVector(Vector v1, Vector v2);
Vector AddVectorInFrameTime(Vector pos, Vector speed);
Vector AddVectorInFrameTime2(Vector pos, Vector speed, Vector accel);
Vector Normalize(Vector in);
Vector RotateVector(Vector in, float radian);
float VectorLengthSquare(Vector in);
float DotProduct(Vector v1, Vector v2);
float CrossProduct(Vector v1, Vector v2);
void SetLine2DKatamuki(Line2D *in);
void DrawLine2D(Line2D in, int Color, int Thickness);
void DrawBall2D(Ball2D in, int Color, int Fill);
//当たり判定関数
bool HitTestLineAndBall(Line2D linein, Ball2D ballin);
bool IsPointAtLineFace(Line2D linein, Point2D ptin);
bool HitTestLineAndLine(Line2D line1, Line2D line2);
bool HitTestBallAndBall(Ball2D a, Ball2D b);
bool HitTestPointAndBox(Rect2D rect, Point2D pt);
//タイマー関数
void SetSimpleTimer(int idx, int time);
int GetPassedTime(int idx);


//グローバル変数
extern float g_frametime;
extern Rect2D g_framerect;//画面領域(当たり判定)
extern Point2D g_current_field_pos;//現在の左上座標
extern Rect2D g_stagesize;//ステージサイズ

//定数宣言
const float ZEROVALUE = 1e-10f;
const float PIE = 3.1415926f;
const int SCROLL_LIMIT = 200;
----------------------------------------------------------------
 エラー内容
1>myhelper.obj : error LNK2019: 未解決の外部シンボル "void __cdecl MyMain(void)" (?MyMain@@YAXXZ) が関数 _WinMain@16 で参照されました
1>C:\Documents and Settings\Owner\My Documents\Visual Studio 2008\Projects\my\Debug\my.exe : fatal error LNK1120: 外部参照 1 が未解決です
1>my - エラー 2、警告 0
ビルド: 0 正常終了、1 失敗、0 更新不要、0 スキップ
----------------------------------------------------------------
画像を貼り付けときます
(見えにくい場合→http://www.dotup.org/uploda/www.dotup.org154142.jpg.html)
初心者なのでわかりやすくお願いします

Microsoft Visual Studio 2008
Version 9.0.21022.8 RTM
Microsoft .NET Framework
Version 3.5 SP1
----------------------------------------------------------------
新しいプリジェクト→Win32 コンソール アプリケーション(ソリューションのディレクトリを作成 チェック外す)→Windows アプリケーション(空のプロジェクト チェック外す)
----------------------------------------------------------------
 プログラム

 mymain.cpp
#include "myhelper.h"
#include "mymain.h"

//自...続きを読む

Aベストアンサー

ファイル構成から推測するに
mymain.cpp というファイルに
void MyMain(void) {
// ここに処理を書く
}
という関数が必要なようです。

QC言語のfopenについて教えてください。

C言語のfopenについて教えてください。

ある1つのファイルをr(テキストファイル読み込みモード)でfopenしたとします。
そのファイルをfcloseする前に、同じファイルが再度rモードでfopenされても問題ないのでしょうか?

何を気にしているかと言いますと、あるプログラムであるファイルをrモードでfopenして読み込む処理があるのですが、そのプログラムを呼び出す処理が複数あります。
確率は低いと言えど、もし同時にその処理が実行された場合、rモードでfopenしているファイルにfclose前に再度rモードのfopenがされたらエラーとなってしまうのでしょうか?
もし、エラーとなる場合、回避する方法がありますか?
また、エラーとならない場合は、fcloseするまで次の処理が待ってしまうのでしょうか?

読み込みモードだから問題ないのかなとも思ったのですが、どなたかご存知だったら教えてください。

よろしくお願いしますm(_ _)m

Aベストアンサー

同じプロセス内の話ならオープンしたファイルハンドルごとで
ファイルハンドルは管理しているので
開きっぱなしでもオープンできる限りはエラーになりません。
ただし、同時にオープンできるファイル数には限界があるので
無尽蔵に開き続けるような場合にはいずれオープンに失敗します
(そういうerrnoがあったはず)
オープンできる限界については
プロセスごとと、OS(カーネルパラメータ)の2段階だった予感

なので、1つのプログラムならば
オープンしたファイルのパス名とハンドルを別管理する等
同じファイルの複数オープンは修正しておいた方がいいと思うけれど
複数のプログラム(実行モジュール)でアクセスしていて
変更できないのなら仕方ないですね。

ただ、
読み取り中に変更されてしまう可能性と変更されると都合悪い場合には
考え直した方がよいですね。
起動元でファイル名にシーケンス番号をつけて渡してあげるとかして
そのファイル名をユニークしてあげるとか

Qprintf による16進表示について

C言語初心者です。

今作っているプログラムで、データを16進形式で表示しようとしています。
大体このような感じです。

/*入力時*/
char buf[5]={0x4e,0x94,0xa0,0x2b,0x78}

/*出力時*/
for (i = 0; i < 5; i++) {
printf("0x%02x\n",buf[i])
}

実際には入力後にある処理によってbufは更新されるのですが、printfの出力結果として、

0xffffff4e
0x94
0xffffffa0
0x2b
0x78

というように、'ffffff'が付加したものがいくつか出力されてしまいます。
これはどういった意味を持つのでしょうか?

なんか初心者ならではの漠然とした質問ですいません。。。

Aベストアンサー

出力は、
0x4e
0xffffff94
0xffffffa0
0x2b
0x78
ではありませんか?
char が符号付(-128~127)のため、0x80~0xffは負の数とみなされます。printfの引数になる時に 符号付charは符号付intに変換されますが、このCコンパイラの場合は、int が4バイトcharが1バイトのため、上位3バイトに負の数を示すffffffが入ります。
char x=255;
printf("%d\n",x);
だと255でなく、-1が表示されます。

対応としては、
unsingned char buf[5]={0x4e,0x94,0xa0,0x2b,0x78}
;
とするか、
printf("0x%02x\n",buf[i]&0xff);
にするかどちらかですね。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング

おすすめ情報