fgetcでint型の数字を書かせたが。。。。 – プログラミング – Home

fgetcでint型の数字を書かせたが...
 
通知
すべてクリア

fgetcでint型の数字を書かせたが。。。。


kj
 kj
(@kj)
ゲスト
結合: 21年前
投稿: 52
Topic starter  

VC++6のユーザーです。
一応,fgetcで読ませた結果,ファイルには書けてはいるようですが,
繰り返し書いたファイルそのものの善用がわかるように,
ファイルをじかに読ませたいのですが,
読めるのは,点ばっか。(........)
ファイル変換か何かで,数字の形で読めるようには出来ないのでしょうか?


引用解決済
トピックタグ
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

書き込んだ元データのように「fgetc」を使って読み込んでもきちんと読み出せない
というご質問でしょうか?

たとえば 元データをこんな風にして書き込んだつもりが
12345 ABCD 改行
12345 ABCD 改行
12345 ABCD 改行
12345 ABCD 改行

「fgetc」を使って読み込んでも
........
........
........
としか読み込めないということでしょうか?

少なくとも、上記のような質問であれば、入力イメージ、出力イメージ
書き込んだ関数(関数名、書き込んだバイト数、構造)を示さないと
回答を得ることは難しいものです

もう少し例題やら、ソースやら提示してくれれば、回答しやすいのですけど
参考に「MSDN データ型の範囲」はごらんになってますよね


返信引用
kj
 kj
(@kj)
ゲスト
結合: 21年前
投稿: 52
Topic starter  

WOODさん。
こんにちは。

そうなんです。

おっしゃるとおりです。

たとえば 元データをこんな風にして書き込んだつもりが
12345 ABCD 改行
12345 ABCD 改行
12345 ABCD 改行
12345 ABCD 改行

「fgetc」を使ってはちゃんと
規定の12345 ABCD
で読めるのですが,
実際にプログラムを終えて,
WORD等のEDITORで開くと
........
........
........
としか読み込めないということです。

単純な話
int A;
int B;
int C;
FILE *fj;

:::::::::
fj = fopen(test.doc,w)
for (A=0;A<100;A++)
fputc(B,fj);
で,
C = fgetc(fj);
では,デバッグ・モードでの
ウォッチで,Cを見ると,全部
期待していた数字が入って来ているのに,
ファイル全体をWORDなり,WORDパッドで見ると,
どこも数字の形になってなくって,
点(.)ばかり。


返信引用
aetos
(@aetos)
Noble Member
結合: 5年前
投稿: 1480
 

C における「数値」と「数字」の違いは理解しておられますか?
int i = 5;
は「数値」です。対して、メモ帳で開いたときに 5 と見えるのは「数字」です。
kj さんは、ファイルに「数値」を書き込んでおいて、それが「数字」として見えない、
とおっしゃっているわけです。
ちなみに数字の '5' は数値では 0x35 です。全然違います。
メモ帳で '5' と表示したいのなら、ファイルには 5 ではなく 0x35 を書き込まねばな
りません。


返信引用
wood
 wood
(@wood)
ゲスト
結合: 23年前
投稿: 895
 

>WORD等のEDITOR
これはキャラクタエディタの部類のものです
つまり、必要に応じて部分的に16進のものを数字化して
表示してくれないものなのです

「シャノン さん」のおっしゃるとおり
int atai=5;
char atai='5';
では、実際の数値は違うと言うことです

「.」と見えるのは、WORD等が表現できない文字と判断し勝手に代替されている
だけです

どうしても、WORD等として見れる値を書き込むには
sprintfなどして文字列化したものを書き込みます

C言語アプリの計算値に使用したいときは読み込んだ文字列を
atoiなどしてint型にしてから使用します


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

>単純な話
>int A;
>int B;
>int C;
>FILE *fj;
>
>:::::::::
> fj = fopen(test.doc,w)
> for (A=0;A<100;A++)
> fputc(B,fj);
>で,
> C = fgetc(fj);

このコードってこのまんま使ってます?

これだとまったくだめだと思いますけれど。
fgetcしたCを使ってfputcしてませんし、
しかもfputcがfgetcよりも前に来ているし。
これでちゃんと動いたら奇跡だと思いますけれど。

単なるサンプルであって本来のコードとはまったく関係ない
のであれば、こちらの早とちりですけれどね。
にしてもサンプルであげるにしてもちゃんと動く例であげないと
意味無いと思いますけれどねぇ。
誤解を生むだけで。


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

あらら、勘違い。

上のコードで書いた内容をしたのfgetcで取り出してみたらという
話だったんですね。
いやはや、私の出る幕ではありませんでしたー。
失礼しました。


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

これだけだとあんまりなのでちょっと一言。

書き込んだデータはWORD等のようなテキストを扱うプログラムで
読めるような状態になっているのが正しいのでしょうか?
それとも読めないような状態になっているのが正しいのでしょうか?

既に皆さんが書いておられるように数値の5と数字の5は違うものです。
数字(文字)の5はテキストを扱うプログラムで読ませれば、5と表示されますが、
数値の5は表示できません。
数字の5は文字コードで5という文字を表す数値が入っています。
シャノンさんが言われている0x35という値です。
数値の5はファイル上でもやはり5という値が入っています。

あなたが数値の5を書き込みたいのか、数字の5を書き込みたいのかで話は
変わってきます。数字の5を書き込みたいのであれば、既に指摘されている通り、
数値を数字に変換して書き込む必要があります。

数値の5を書き込みたいのであれば、ファイルの内容を確認する方法がまずいだけです。
テキストエディタのようにテキストで無いと表示できないソフトを使うのではなく、
数値を直接参照できるバイナリエディタやファイルダンプを行うプログラムを使用して
確認する必要があります。
VC++6のIDEでバイナリ扱いでファイルを開けば、書き込み内容が確認できます。
これが一番手軽だと思いますので試してみてはどうでしょうか?


返信引用
tib
 tib
(@tib)
ゲスト
結合: 23年前
投稿: 468
 

PATIO さん:
> このコードってこのまんま使ってます?
> これだとまったくだめだと思いますけれど。
いや、私もこれでは提示するサンプルとして不十分だと思います。

>int A;
>int B;
>int C;
>FILE *fj;
>
>:::::::::
> fj = fopen(test.doc,w)
> for (A=0;A<100;A++)
> fputc(B,fj);

Bにはどこで何を設定して、fputc()しているんですか?


返信引用
PATIO
(@patio)
Famed Member
結合: 4年前
投稿: 2660
 

というよりもこういう場合は、ソースがよっぽど長いものでない限りは
そのまま出してしまったほうがいろいろ指摘してもらえるのでよいと思いますね。

質問の内容からするとまだ初めて間もない感じがするので
問題があるコードの書き方をしているような場合には、早めに指摘してもらって
直してしまったほうが変な癖がつかないのでよいと思います。

それに自分が書いているコードと違うコードをわざわざ出してサンプルにするよりも
今実際に書いているコードを提示して不要な部分があれば削ったほうが早いでしょう。
サンプルで出すならなるべくコンパイルが通るレベルである方が問題が少ないですし。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました