• 締切済み

意味のよく分らないソース

D-Matsuの回答

  • D-Matsu
  • ベストアンサー率45% (1080/2394)
回答No.4

一応No.2に補足しておきますが、Cの真偽値は真(非0)と偽(0)です。つまり-1でも2でも0ではないので真になります。 たとえばif(feof(stdin))の意味はif(feof(stdin)==1)では間違っており、if(feof(stdin)!=0)が正しい解釈になります。 #実はfeof()がEOFを発見したときに返る値は実装依存なので、前者で書くとEOFを判定できずに思わぬ不具合を引き起こす可能性があります 今回の質問とは直接関係のない蛇足ですが、参考までに。

glarelance
質問者

お礼

なるほど、解答有り難うございます

関連するQ&A

  • stdin,stdoutについて

    C言語を学び始めたものです stdin・stdoutがどのように機能するか分かりません またstdoutはどこに出力しているんですか #include <stdio.h> int main(void) { char ch; while(!feof(stdin)) { scanf("%c", &ch); if(!feof(stdin)) printf("%c", ch); } return 0; } このプログラムは「コンソール」入出力関数だけを使用しテキストファイルの内容を別のテキストファイルにコピーするプログラムだそうですがどのテキストファイルの内容をどこのテキストファイルにコピーしているんですか?stdin・stdoutの機能が全く分かりません。 どなたか分かる方、回答お願いします。

  • ifstream/ofstream について

    こんにちは。 よろしくお願いいたします。 ifstream で定義したファイルを open し、一端 close した後再度 open しようとすると、エラーとなります。 何が原因かわかりますでしょうか? ちなみに、インファイル.txt は何も記載していないので、下記ソースのwhileループ内には入りません。 が、whileループが有ればエラー(メッセージ:3103)が発生し、 無ければ、エラーは発生しません。 環境:XP home & ボーランドC++Builder6.0 テストしたソース: void __fastcall TForm1::Button6Click(TObject *Sender) { ifstream InFile; ofstream OutFile; char cBuf[255]; InFile.open("インファイル.txt"); if (!InFile) ShowMessage("3101"); OutFile.open("アウトファイル.txt"); if (!OutFile) ShowMessage("3002"); while (!InFile.getline(cBuf, sizeof(cBuf)).eof()) { OutFile << cBuf << endl; } // このwhileループが無ければ、エラーは発生しません。 OutFile.close(); InFile.close(); InFile.open("インファイル.txt"); if (!InFile) ShowMessage("3103"); // ここでメッセージが出力されます。 }

  • fflush(stdin)の使い方とprintf()関数getchar()関数の違いについて

    はじめまして。 現在c++を勉強し始めて1週間の初心者です。 fflush(stdin)について質問です。下記のプログラムで小文字入力したアルファベット1文字を大文字に変換して出力しています。方法(1)ではgetchar()関数とputchar()関数を使用していますがどうしてこの場合にはfflush(stdin)が必要となり、方法(2)のprintf()関数とscanf()関数を使用した場合はfflush(stdin)が必要ないのでしょうか?どなたか私のような初心者でも分かるように詳しく説明してもらいたいです。 何故かプログラムを書いているとprintf()とscanf()がよく混乱します。原因として、printf()を先に書く場合と、scanf()を先に書く場合が有るからだと思っているのですが、まだよく理屈の理解ができません。なので出来ればこれらの関数についても基本的な概念を教えていただきたいです。それと方法(2)では何故最後にscanf(%c):が無くても良いのかも良く理解できません。 どなたか是非とも回答宜しくお願いします。 #include <stdio> main void() { 方法(1) printf("\n文字を1つ入力してください:"); fflush(stdin);    char ch=getchar(); ch=ch-32; putchar(ch);    方法(2) printf("\n文字を1つ入力してください:") //fflush(stdin);必要なし???    char ch; scanf("%c",&ch); ch=ch-32; printf("%c",ch);    //scanf(%c):??? }

  • 改行を含んだ文字列を正規表現で置換するには?

    正規表現で、改行を含んだ文字列を置換しようと思っています。 例えば下の「infile.txt」にある aaa bbb という(2行にわたる)文字列を zzz という文字列に変換させたい訳です。 試しに「test.vbs」のようなコードを書いてみましたが、これでは上手く行きませんでした。 上手く変換されるようにするには、どうしたら良いでしょうか? ----------------------------------------------------- ○「test.vbs」の内容 Set fso = CreateObject("Scripting.FileSystemObject") Set inFile = fso.OpenTextFile("C:\infile.txt") Set outFile = fso.CreateTextFile("C:\outfile.txt") Set regEx = New RegExp regEx.pattern = "aaa\nbbb" repStr = "zzz" Do Until inFile.AtEndOfStream tempLine = inFile.ReadLine repLine = regEx.Replace(tempLine, repStr) outFile.WriteLine repLine Loop inFile.Close outFile.Close ----------------------------------------------------- ○「C:\infile.txt」の内容 aaa bbb ccc

  • ファイルの変換で文字化けを回避したい

    ファイル中の文字列を一部書き換える処理をしています。regEx.replaceを使って書き換えたところ、日本語が下記のように文字化けしてしまいます。 これを回避するためにどうしたら良いでしょうか? ○変換前:test1.txt <description>東京都</description> ○変換結果:test2.txt(文字化け) <description>譚ア莠ャ驛ス</description> ○スクリプト Set fso = CreateObject("Scripting.FileSystemObject") Set inFile = fso.OpenTextFile("c:\test1.txt") Set outFile = fso.CreateTextFile("c:\test2.txt") Set regEx = New RegExp regEx.pattern = "テスト" repStr = "てすと" Do Until inFile.AtEndOfStream tempLine = inFile.ReadLine repLine = regEx.Replace(tempLine, repStr) outFile.WriteLine repLine Loop inFile.Close outFile.Close

  • テキストファイル中の文字列を書き換えるスクリプトを書きたい

    テキストファイルの文字列を書き換えるスクリプトを考えています。 今、次のところまで出来るようになりました。本当は「こんにちは」の文字列を全て「HELLO」に置換したいのです。現在は一行の中で最初の「こんにちは」は置換されますが、2番目以降が置換されません。同じ行中の2番目以降も置換するには、どうしたら良いでしょうか? <置換前ファイル:sample.txtの中身> こんにちはこんにちはこんにちはこんにちは こんにちは こんにちは <置換前ファイル:sample.txtの中身> HELLOこんにちはこんにちはこんにちは HELLO HELLO <置換スクリプト> Set fso = CreateObject("Scripting.FileSystemObject") Set regEx = New RegExp Set inFile = fso.OpenTextFile("C:\static\sample.txt") Set outFile = fso.CreateTextFile("C:\static\sample1.txt") regEx.Pattern = "こんにちは" repStr = "HELLO" Do Until inFile.AtEndOfStream tempLine = inFile.ReadLine repLine = regEx.Replace(tempLine, repStr) outFile.WriteLine repLine Loop inFile.Close outFile.Close

  • スイッチのソースの書き方について

    ライントレースのタッチセンサー1つを使ってON/OFFができるようにしたいのですが 下記のソースだとライントレースをしていて、黒いラインの上にいるときにしかON/OFFできません。 これを白い部分(ラインから外れたところ)でもスイッチがきくようにするにはどのようにすればいいでしょうか? /* ライトセンサーの判定値 */ #define kuro 10 /* Touch Sensor control */ /* タッチセンサーの状態を判断 戻り値 0:タッチセンサーが押されていない 1:タッチセンサーが押されている */ int GetTouch(unsigned char ch) { if (pAnalog->Pin6[ch][pAnalog->Actual[ch]] > 1000) { return 1; } else { return 0; } } int migi(unsigned char ch) /*右まわり*/ { MotorPower(CH_C, -20); /* 出力ポートCのパワーを-20%(逆回転)に変更 */ MotorPower(CH_B, 40); /* 出力ポートBのパワーを10%(逆回転)に変更 */ return 0; } int hidari(unsigned char ch)/*左まわり*/ { MotorPower(CH_C, 40); /* 出力ポートCのパワーを10%(逆回転)に変更 */ MotorPower(CH_B, -20); /* 出力ポートBのパワーを-20%(逆回転)に変更 */ return 1; } int mae(unsigned char ch) /*前進*/ { MotorPower(CH_C,45 ); /* 出力ポートCのパワーを10%(逆回転)に変更 */ MotorPower(CH_B,40 ); /* 出力ポートBのパワーを-20%(逆回転)に変更 */ return 1; } /* Light Sensor control */ /* ライトセンサーの値を取得 */ unsigned char GetSensor(unsigned char ch) { return((unsigned char)pUart->Raw[ch][pUart->Actual[ch]][0]); } int main(void) { int R = 0; MotorReset(CH_B|CH_C); /* モーターの状態をリセット */ MotorStart(CH_B|CH_C); /* モーター起動 */ while(1) { /* 永久ループ */ if(GetTouch(CH_2) == 1){ while(GetTouch(CH_2) == 0); MotorPower(CH_B|CH_C, 0); /*出力ポートB,Cのパワーを0にする*/ while(GetTouch(CH_2) == 1); /* はなされるまで待つ */ while(GetTouch(CH_2) == 0); /*押されるまで待つ*/ MotorPower(CH_B|CH_C, 40); /*出力ポートB,Cのパワーを50、50にする*/ while(GetTouch(CH_2) == 1); } clock_t start,end; if (GetSensor(CH_3) > kuro ){ /* 入力ポート3のライトセンサーが設定値を超えている場合…*/ start = clock(); /*時間測定スタート(ここから)*/ if( R == 1 ){ migi(CH_B|CH_C); /*右回り*/ }else{ hidari(CH_B|CH_C); /*左回り*/ }//elseのカッコ }//ifのカッコ while(GetSensor(CH_3) > kuro){/* 入力ポート3のライトセンサーが設定値を超えている場合…*/ end = clock();/*時間測定終了(ここまで)*/ if(((double)(end - start)/CLOCKS_PER_SEC)>0.2){ if( R == 1 ){ hidari(CH_B|CH_C); /*左回り*/ R = 0; while(GetSensor(CH_3) > kuro);/* 入力ポート3ライトセンサーが設定値を超えている場合は待つ*/ }else{ migi(CH_B|CH_C); /*右回り*/ R = 1; while(GetSensor(CH_3) > kuro);/* 入力ポート3ライトセンサーが設定値を超えている場合は待つ*/ }//elseのカッコ }//ifのカッコ }//whileのカッコ mae(CH_B|CH_C); /*前進する*/ }//whileのカッコ }//mainのカッコ

  • ファイル入出力で

    現在ファイル入出力の項目をしているのですが、以下の内容で実行すると エラーが出てどうしても実行できません。主にどこを直せばいいのでしょうか? /* ファイルをコピーするプログラム */ #include <stdio.h> int main(void) { FILE *fin, *fout; char infile[40], outfile[40]; char str[256]; printf("コピー元ファイル = "); scanf("%39s", infile); printf("コピー先ファイル = "); scanf("%39s", outfile); if( (fin = fopen(infile, "r") ) == NULL) { printf("Input file open error.\n"); return 1; } if( (fout = fopen(outfile, "w") ) == NULL) { printf("Output file open error.\n"); fclose(fin); return 1; } while(fgets(str, sizeof(str), fin) != NULL) { fputs(str, fout); } fclose(fin); fclose(fout); return 0; } エラーは FILE 、fin, fout,NULLの未定義です。 よろしくお願いします。

  • scanf関数 バッファに残ったエンター入力の扱い

    前日質問にて以下のプログラムで、二度目のscanf()が無視されてしまう 旨質問したところ、1度目のscanfでの入力でエンターがバッファに残って いるため、それを取り込んでしまうという回答いただきました。 改善方法として(*)のscanf関数で「%c」の前に空白を入れたところ 正常に動作し、改善されたのですが、なぜ改善されたのかご教示願えませんでしょうか? よろしくお願いします #include <stdio.h> int main(void) {   int g;   char ch;      do {     printf("何ガロンですか?: ");     scanf("%d", &g);     printf("%.2fリットルです\n", 3.7854 * g);     printf("また計算しますか?Y/N : "); (*) scanf("%c", &ch);   } while(ch == 'Y' || ch == 'y');   return 0; }

  • 何バイトめか調べる

    これは、指定したテキストに整数3があった場合、 ファイル先頭から何バイトか調べるプログラムです。 実行しても何も表示されませんでした。 どこが間違ってるか教えてください。 a.txtに、abcdefghij123  と書かれているとします。   FILE *fp;   int ch,val=3;   fp=fopen("a.txt","rb")   while( !feof (fp) ){      ch=fgetc(fp);      if(ch==val)      printf("%ld", ftell(fp) ); }           fclose(fp);      return 0; }