2012-03-11 37 views
1

ファイルから特定の整数を読み取る際に問題がありますが、その理由がわかりません。最初にファイル全体を読み取って、どれぐらい大きいかを調べてから、ポインタを最初にリセットします。私はその後、3つの16バイトブロックのデータを読みました。その後、1 20バイトのブロックと私は整数として最後に1バイトを読み取るしたいと思います。しかし、私はキャラクターとしてファイルに書き込む必要があったが、それは問題ではないと思う。私の問題は、15の整数値ではなくファイルから読み取ったときに49であることです.ACIIの表をチェックしましたが、1または5の16進数または8進値ではありません。私は完全に混乱しています私が正しいと信じているread(inF, pad, 1)です。私は整数変数が4バイトであることを知っていますが、ファイルには1バイトのデータしか残っていないので、最後のバイトだけを読み込みます。
私のコードは、機能を再現している(それはたくさんのように思えるが、それはそれはないと思う)C言語のテキストファイルからの読み取り

コードは、私がバイトを読んだとき

#include<math.h> 
#include<stdio.h> 
#include<string.h> 
#include <fcntl.h> 


int main(int argc, char** argv) 
{ 
char x; 
int y; 
int bytes = 0; 
int num = 0; 
int count = 0; 



num = open ("a_file", O_RDONLY); 

bytes = read(num, y, 1); 

printf("y %d\n", y); 

return 0; 
} 

は私の質問を要約すると、どのように来ていますテキストファイルから15を格納すると、整数表現から15と見なすことはできませんか? ご協力いただければ幸いです。 ありがとう!

+1

私は非常にあなたがデータでやっているものを見つけることができませんので、「から番号を読み取るようにあなたはおそらく、単純な何かにあなたのコードを減らす必要がありますファイル "と"数字をファイルに書き込む " - これは実験するほうがはるかに簡単です。 – che

+0

@cheコードを類似しているが非常にシンプルに変更しましたが、私はまだ同じ問題を抱えていますが、提案はありますか? – tpar44

+1

ここにヒントがあります:49は、ASCII文字 '1'の小数値です。 – blueshift

答えて

0

read関数に基づいて、整数の4バイトの最初のバイトの最初のバイトを読み込んでおり、そのバイトが最下位バイトに配置されていないと思います。これは、たとえあなたがゼロに初期化されていても(他のバイトに0を持つ)、他の3バイトのパッドにあるものはそこに残ることを意味します。 (あなたには、いくつかの理由のために4バイトの整数が必要な場合)は、以下に示すように、私は、1つのバイトを読み込み、その後、整数にキャストします:

/* declare at the top of the program */ 
char temp; 

/* Note line to replace read(inF,pad,1) */ 
read(inF,&temp,1); 

/* Added to cast the value read in to an integer high order bit may be propagated to make a negative number */ 
pad = (int) temp; 

/* Mask off the high order bits */ 
pad &= 0x000000FF; 

をそうでない場合、あなたはどのunsigned char型であるためにあなたの宣言を変更することができます他の3バイトを処理します。

+0

助けてくれてありがとう!残念ながら、それは動作しませんでした... – tpar44

+1

'read(inF、&temp、1);'または何かが不足していますか? –

+0

あなたは正しいです。私は関数がtempのアドレスを望んでいることを示すのを忘れていました。修正を反映するようにコードを変更しました。 – Glenn

0

読み取り機能のシステムコールのような宣言がありますので、

ssize_t read(int fd, void* buf, size_t count); 

を、あなたがものを読みしたいint型の変数のアドレスを渡す必要があります。 すなわち

bytes = read(num, &y, 1); 
0

はあなたがint(4バイト)の最初のバイトを読んでいることlink

1

からCにファイルI/Oのすべての詳細を見ることができます使用して、としてそれを印刷全体。これはのみ動作することを

int temp; // four byte signed integer 
read(fd, &temp, 4); // read it from file 
printf("%d\n", temp); // print four-byte signed integer 

注:あなたが定期的にint型を使用することができ、

char temp; // one-byte signed integer 
read(fd, &temp, 1); // read the integer from file 
printf("%hhd\n", temp); // print one-byte signed integer 

をまたは:あなたは1バイトで読みたい場合は、このように、1つのバイトとしてそれを使用することも必要32ビット整数のプラットフォームでは、また、プラットフォームのbyte orderに依存します。何をやっている

は次のとおりです。

int temp; // four byte signed integer 
read(fd, &temp, 1); // read one byte from file into the integer 
    // now first byte of four is from the file, 
    // and the other three contain undefined garbage 
printf("%d\n", temp); // print contents of mostly uninitialized memory 
関連する問題