sprintfが、途中にブランクがあると、1行全部、読み取れない – プログラミング – Home

sprintfが、途中にブランクがある...
 

[解決済] sprintfが、途中にブランクがあると、1行全部、読み取れない  

  RSS

いえやす
 いえやす
(@いえやす)
ゲスト
参加済み: 10年 前
投稿: 18
2019年8月23日 4:15 AM  

いつも、お世話になっております。

うーん。
sprintfは、1行全部、読み取れると訊いていたのですが、
使ってみると、
例えば、
あるファイルで、
aaaa bbbb cccc
dddd eeee ffff
とあると、
char Buf1[250];
char Buf2[250];
FILE *fp;
として、
そのファイルをfopenした後、
sprintf(fp, %s, Buf1);
sprintf(fp, %s, Buf2);
とした場合、
当然,Buf1には、
aaaa bbbb ccccが、
Buf2には、
dddd eeee ffffが、
入って来ることを期待したのですが、
printfなどで、確認すると、
Buf1には、最初のスペースの区切りまでの
aaaaしか
Buf2には、2番目のスペースの区切りまでの
bbbbしか取り込んでいないのです。
これでは、私の組んだプログラムでは、
スペースなしの文章だと、使えず、何故かなあ、と思いまして。
私の、ちょっとしたミスやオプション入れずだとは思うのですが、
どなたか、お教えいただけると、幸いです。


引用未解決
トピックのタグ
仲澤@失業者
(@uncle_kei)
Prominent Member
参加済み: 3日 前
投稿: 829
2019年8月23日 1:36 PM  

質問の内容が理解できませんでした。
というのも、関数 sprintf() は文字列のフォーマット用の関数(つまり出力系)
なので、何をしたいのか読み取れなかったのです。

で、「ファイルから一行単位で読み込みたい」と解釈しなおすと、
次の様なコードになります。
【前提条件】「ファイル名」をtextFile.txtとしてフォルダがC:\dにあるとすると

FILE * fp = fopen( c:\\d\\TextFile.txt, r); // 読み込みモードでオープン
char Readbuf[ 512];
while( 1){ // 失敗するまで無限に繰り返す。
char * p = fgets( Readbuf, 256, fp);
if( NULL == p){ // 読み込みに失敗した場合
break; // ループを脱出する
}
// 以下に一行読み込みに成功した場合の処理を書きます。
}

以上の様にsprintf()の出番はありません。
また、全行がReadBuf[]に読み込まれますので注意してください。


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
参加済み: 3日 前
投稿: 829
2019年8月23日 1:39 PM  

バッファ量「512」と読み込みByte数「256」があってませんが、
どちらかに合わせて下さい。orz.


返信引用
いえやす
 いえやす
(@いえやす)
ゲスト
参加済み: 10年 前
投稿: 18
2019年8月25日 4:30 PM  

中澤様。
ありがとうございます。
sprintfではなく、広く、文字列を持って来るのは、
fgetsでしたね。
ご指摘を受け、それに変えてみたら、
どんどん、期待どおりの文字列が入って来ております。

あと、その文字列から、所定の場所の1文字だけ取り出して、
int型に変えてみたいのですが、

FILE *fp;
char Buf[255];
char OP;
int i;
int CorNo[20];

fgets(Buf, 250, fp);
OP = Buf[17];
CorNo[i] = atoi(OP);
とやっているのですが、
fgetcをした後に、Buf自体の中身を確認すると、
期待値どおり、'Correct Answer = 4 '
と入って来るものの、
OP自体に、所定の文字(Buf[17]の4と言う文字だけを取りたいのです)
が入って来ないのですが、
また、初歩的なミスをやってるのでしょうか?
また、教えていただけると、幸いです。


返信引用
仲澤@失業者
(@uncle_kei)
Prominent Member
参加済み: 3日 前
投稿: 829
2019年8月26日 1:23 PM  

まず、使用するコンパイラにもよりますが、コードに問題があると警告やエラーが出力さ
れます。
一般に、これらを無視して続行しても希望する結果を得られない場合があります。

例えば

char OP = '4';
int value = atoi( OP); // <==エラーC2664が発生する

をコンパイルすると  Visual Studio の場合には「出力ペイン」に

>・・・ error C2664: 'int atoi(const char *)' : 引数 1 を 'char' から 'const cha
r *' へ変換できません。

の様に、関数atoi()の引数1の「型」は「char のポインタ型」なので、「char型」を引数
にできない旨が出力されます。
自分も覚えたての頃(ぅん十年前)はポインタの理解不足からよくやりました。
まず「変数」と、その「変数のポインタ」の意味を入門書等で学ぶのが良いかもしれませ
ん。
先の場合「&OP」を渡さなければいけないわけですね。

次に、表示上の「数字(ASCIIコードの'0'~'9')」は文字ですが、
これらの文字コードの値は16進数で「0x30~0x39」 であり、
十進数で表すと「48~57」である点にも注意が必要です。


返信引用
いえやす
 いえやす
(@いえやす)
ゲスト
参加済み: 10年 前
投稿: 18
2019年9月2日 10:02 AM  

中澤様 お世話になっております。
ご指示にしたがって、修正してみたら、
今度は、CorNo[i]
に正しい値が入ってきました。

本当にありがとうございました。


返信引用
いえやす
 いえやす
(@いえやす)
ゲスト
参加済み: 10年 前
投稿: 18
2019年9月2日 10:06 AM  

お礼まで


返信引用

返信する


Preview 0 Revisions Saved
Share:

ログイン または 登録 してください

タイトルとURLをコピーしました