string temp;
ifstream f(test.txt);

while(getline(f, temp)){

(省略)
}

こんなかんじで、入力ファイルから1行づつ読み込んでいくのですが、もし、tempに改行のみが入った場合、(例えば入力ファイル test.txt に1行目、2行目は文があるが、3行目は改行で、4行目からまた文があり、読み込みたいのは、2行目までといった場合)
即while文から抜けるというふうにしたいのですがどうすればいいでしょうか?
詳しい方お願いします。

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

A 回答 (2件)

while( getline(f, temp) && !temp.empty() ){


(省略)
}

その1.
getlineは改行文字は読み込まないので空行ならtempは文字数=0になる。

その2.
getline(f,temp)がfalseなら!temp.empty()は評価されない。

おまけ。
basic_stringに読み込むgetline()はれっきとしたC++標準ライブラリの関数です。
    • good
    • 0
この回答へのお礼

ありがとうございました。自分の思っていた通りに実行できました。ありがとうございました。

お礼日時:2005/04/15 00:49

…getlineってC++?


open watcomのライブラリ調べたけどないような…

さて

1行ずつ読めるんですね?
で、改行は0x0a(lf)/0x0d(cr)/0x0d+0x0a(cr+lf)のどれかですよね?

while(getline....
{
int brkflg=0; // 終了フラグ
switch(temp[0])
{
case 0x0d:
case 0x0a:
//空行なので、抜ける
brkflg=1;
break;
}
if(brkflg) break;
// 行単位の処理...
}
//読み込めなかった or 空行が来たので抜けてきたはず

ということじゃないのかなあ。

この回答への補足

ありがとうございます。早速参考にしてやってみたのですがうまくいきませんでした。

>…getlineってC++?
C++のはずです。私が読んでいる参考書(明らかに初心者用)によると、
getline(ファイル, String変数);
とすることで、ファイルから、1行String変数に読み込むというものらしいです。getlineは、ファイルの終わりに来て読み込むべきものがなくなると、実質0やfalseと同じような「失敗の合図」を返すそうです。

ちなみに、こんな言い方でいいのかわかりませんが、includeファイルはiostreamです。
実際に質問のときの例で最後まで、実行し、画面に出力すると、
1行目の文********
2行目の文********
3行目 改行
4行目の文********

こんな感じになります。

補足日時:2005/04/15 00:26
    • good
    • 0
この回答へのお礼

無事解決しました。ありがとうございました。

お礼日時:2005/04/15 00:50

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

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

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

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

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

QC++で書いてあるフリーソフトの不具合を修正したい

C++は、以前 BCCで 学んだ程度なので 復習をかねて 上述の 既存の MFCを使った C++のソースを 解析して 手を加えたいと 思っています。無論、MFCの知識は皆無です。
現在 BCCも入っていませんが 新たに 環境をインストールするのなら MSの Visual C++ 2010 Express Editionで 良いのでしょうか? またC++の再学習 や MFCについての 良いサイト もしくは 書籍があれば ぜひ 紹介してください。お願いいたします。

Aベストアンサー

>直したい フリーソフトは CD Manipulator というソフトです。
>http://www.storeroom.info/cdm/cdm-license.txt です。

見て見ましたが、VisualStudio2003以降ならOKだと思います。

MFCを使うには購入するしか無いのでMicrosoft Visual Studio 2010 Professionalの購入を検討して下さい。
VC++2010Expressを持っていればアップグレード版を購入できます。学生さんならアカデミック版が安いです。
「Amazon.co.jp: Microsoft Visual Studio 2010 Professional アップグレード: ソフトウェア」
http://www.amazon.co.jp/dp/B003LTZ1VU/

●MFC。古いですが良書がなくて。
「Amazon.co.jp: 標準講座MFC6.0―Visual C++による効率的なWindowsプログラミング (Programmer’s SELECTION): ハーバート シルト, 田中 正造, Herbert Schildt, コスモワークス: 本」
http://www.amazon.co.jp/dp/4881357042/

>直したい フリーソフトは CD Manipulator というソフトです。
>http://www.storeroom.info/cdm/cdm-license.txt です。

見て見ましたが、VisualStudio2003以降ならOKだと思います。

MFCを使うには購入するしか無いのでMicrosoft Visual Studio 2010 Professionalの購入を検討して下さい。
VC++2010Expressを持っていればアップグレード版を購入できます。学生さんならアカデミック版が安いです。
「Amazon.co.jp: Microsoft Visual Studio 2010 Professional アップグレード: ソフトウェア」
http://www....続きを読む

Qwhile for/ if else/do while文を使い”640968592”の各数字を独立させて取り出すことは可能でしょうか?

忙しい中失礼します。

今以下のようなプログラミングを組もうとしています。
1.”640968592”といった9桁の数字を入力→scanfで入力(これは出来ます)
2.各桁の数字を独立させて取り出す:”6” ”4” ”0” ”9” ”6”・・・といった具合に(これも一応出来ます)
3.偶数桁は2倍する
  2桁目:4x2=8
  4桁目:9x2=18
  6桁目:8x2=16
  8桁目:9x2=18

そして、私の場合、以下のようなプログラムになるのですが、これがなんとも不細工な感じがし、スマートにプログラムを変更したいと思っています。

抱えている問題:while for/ if else/do while文などを用いて、下記のプログラムを書き直すことは可能なのでしょうか?例え出来たとしても、文int=num1~num35までの定義も減らすことは可能なのでしょうか?
手も足も出ない・・・

プログラム内容
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
int main()
{
int num1,num2,num3,num4; /*8 9桁目*/
int num5,num6; /*7桁目*/



int num15,num16; /*2桁目*/
int num17; /*1桁目*/
int num19,num20,num21,num22,num23,num24,num25;
int num26,num27,num28,num29,num30,num31,num32;
int num33,num34,num35;


printf("Write the SIN: ");
scanf ("%d", &num1);

num2=num1 / pow(10, 8); //9桁目

num3=num1 / pow(10, 7); //8桁目
num4=num3 % 10;

num5=num1 / pow(10, 6); //7桁目
num6=num5 % 10;



num15=num1/pow(10, 1); //2桁目
num16=num15%10;

num17=num1%10; //1桁目

num19=num4*2; //8桁目計算
num20=num19/10;
num21=num19%10;
num22=num20+num21;



num31=num16*2; //2桁目計算
num32=num31/10;
num33=num31%10;
num34=num32+num33;

system("pause");

return 0;
}

こんなのが直ぐにプログラムとして早く組めるようになりたい・・・


どうしても頭に浮かばないのです。アドバイス等あればお願いします。

<使用環境:フリーソフト(Borland?)C ANSI C>

忙しい中失礼します。

今以下のようなプログラミングを組もうとしています。
1.”640968592”といった9桁の数字を入力→scanfで入力(これは出来ます)
2.各桁の数字を独立させて取り出す:”6” ”4” ”0” ”9” ”6”・・・といった具合に(これも一応出来ます)
3.偶数桁は2倍する
  2桁目:4x2=8
  4桁目:9x2=18
  6桁目:8x2=16
  8桁目:9x2=18

そして、私の場合、以下のようなプログラムになるのですが、これがなんとも不細工な感じがし、スマートにプログラムを変更したいと思っています...続きを読む

Aベストアンサー

プログラム的にはほぼ合っていますが、ループ化するには向きません。
間違いは、ケタが1ketame~3ketameと書いてあるが逆。

ループ化する布石として、
・なるべく数値を直接使わないで変数から求めるようにする。
1ketameとかは、%dketameで変数からケタを表示する。
/100なら、/ pow(10,変数)で計算する。
両方とも、変数ketaから求められますよね。
keta=3;を初期値として、keta--;で減算しながら書いてみてください。
ketanumも3つでは無く1つの変数で処理します。毎ケタ毎残す必要が無ければ同じ変数を使って良いんです。

できあがったプログラムを見てください。同じような処理の繰り返しでループ化できそうになりませんでしたか?

Qvista向けのC++フリーソフト

vista対応のC++のフリーソフトを探しています。
何かいいソフトがあれば教えていただけませんか?
できればURLも添えていただければ助かります。
お願いします。

Aベストアンサー

C++のプログラミングツールが欲しい、と言うことでよろしいですか?
でしたら、Microsoft社のVisual C++ 2005 Express Editionが有ります。
http://www.microsoft.com/japan/msdn/vstudio/express/

システム要件に、きちんと「WindowsVista」の記載があります。

Qwhile文とif文

#include <stdio.h>
void main()
{

char str[2][6] = {"hello","lop"};
int i = 0;

while(i < 2){

printf("%s\n", str[i++]);

}
}

上のプログラムの条件判定の部分にif文を
つかうとhelloという文字列しか出力されず
while文を使うとhelloとlop 二つ出力され
ます。上の条件判定のif文にした時ととwhile
文にした時の違いはどこなのでしょうか??

どなたかご教授よろしくお願いしますm(_ _)m

Aベストアンサー

 while は,「かっこ内の条件が成立している間ループする」です。一方,if は「かっこ内の条件が成立したら以下を実行する」です【反復は起こりません】。

 while (i < 2) { ... } は,まず i == 0 で { } 内が実行されます。そして i++ で i は 1 になります。そして反復します。i == 1 で 2 より小さいですから,もう一度 { } 内を実行 i++ で i は 2 になって,反復します。ここで i < 2 は満たされなくなるので,{ } 内は実行されずに次に実行が移されます。
 一方,if (i < 2) { ... } ですと,「i < 2 ならば { } 内を実行する」だけですから,i == 0 条件は合致,{ } 内を実行します。i++ で i は 1 になりますが,それで反復はしません。そのまま次に実行が移ります。

 以上,おわかりいただけたでしょうか。

Qフリーで使えるボーランドC++5.5

フリーで使えるボーランドC++5.5を
個人事業者が会計ソフトを作ってそれを会計処理に使うのは許されていないのでしょうか?
フリーソフトを作って配布するのはいいらしいのですがこの場合はどうでしょうか?

Aベストアンサー

こういう問題は人に聞く前にライセンス契約をしっかり読んで確認すべきです。
BorlandC++Compilerのライセンスには、コンパイラの使用者についての制限はありますが、それを用いて開発したアプリケーションプログラムの配布には制限がありません(再配布可能ファイルについては制限および付加条件あり)。
ですので商業配布も可能なはずです。

「個人事業者が会計ソフトを作ってそれを会計処理に使う」こと自体に支障はありません。
ただし、開発者が一人であることが求められています。

Qfor文while文の無限ループの違いについて

for文の無限ループ for(; ;) と、
while文の無限ループ while(1) は、
どのように違うのですか?

処理速度やCPU負荷を考慮して、
どちらを使用するか悩んでいます。

よろしくお願いします。

Aベストアンサー

最適化されれば、どちらも一緒と思います。
心配?ならアセンブラのソースを出力させて確認するのが一番かと。(もしくは、デバッグでコードを確認)
ちなみに、Borland Free Compilerでは、どちらのループ命令もジャンプ命令が1個生成されるだけです。

こんな感じのコードになりました
loop_top:
ループ内処理のコード
jmp loop_top

QフリーでC++用NCLOCカウントツールありますか?

Visual C++で開発中なのですが、NCLOC(コメント抜き行数)を計測したいです。

できれば定期的に自動計測したり、他のソフトと連係して
レポート作成させたりしたいので、コマンドラインで動かせると
ありがたいです。

フリーソフトだと、C言語用やGUIで操作するアプリは見つけましたが、
上記の条件に合いそうなのが見つけられませんでした。

Windows上でもLinux上でもよろしいので、
ご存じの方、教えてください。よろしくお願いします。

Aベストアンサー

cccc(C and C++ Code Counter)というソフトがあるようです。
http://x68000.q-e-d.net/~68user/unix/pickup?cccc

Linux のコマンドラインから起動します。
Ubuntu のパッケージにも含まれているのでインストールしてやってみましたが、html, xml, db の 3種類6つのファイルが生成されました。出力情報が多く、中身の読み方はよくわかりませんが、複数のファイルを同時に処理したりもできるので、定期的に実行することにより自動的にレポートが作成できそうです。

xml を cvs に編集しなおして表をつくる python スクリプトもありました。
http://d.hatena.ne.jp/Wacky/20070814/1187096320

参考までに

参考URL:http://sourceforge.net/projects/cccc

Qswitch文とwhile文を用いたプログラムに関して

swich文とwhile文を用いたプログラムについて

授業の課題で、swich文とwhile文を用いたプログラムを作りなさい。いう課題が出ました。

5桁以上9桁以下の正の整数を入力し、4で割り切れたとき、何桁の数字かを出力。4でわって1余ったとき、すべての桁の合計を出力。3余ったとき、与えられた数の逆を変数に代入し、その変数を出力(単純に表示するわけではなく、数字として表示)

といったものです。
途中からの授業参加で、C言語に関する知識はほとんどありません。do文を用いたプログラムは見つけれたのですが、while文とswich文を用いろということなので、do文は使えないです。

どなたか教えていただけませんか?
今日中にわからないとちょっとやばいです・・・。
よろしくお願いします

Aベストアンサー

こんな感じでいいのかな?

#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "math.h"

int main(int argc, char* argv[])
{

char sInput[32];
int iInput=0;
int iLen=0;
int iMod=0;
int iSum=0;
int iReb=0;
int iCnt=0;
char sBuf[32];

memset(sInput,0,sizeof(sInput));
memset(sBuf,0,sizeof(sBuf));
scanf("%s",&sInput);
iLen = strlen(sInput);

if( iLen > 9 || iLen < 5 )
{
printf("対象桁数外");
return 0;
}

iInput = atoi(sInput);

iMod = iInput % 4;

switch(iMod)
{
case 0:
printf("入力された数字は %d 桁です。",strlen(sInput));
break;
case 1:
while(iCnt < iLen)
{
sprintf(sBuf,"%c",sInput[iCnt]);
iSum += atoi(sBuf);
iCnt++;
}
printf("入力された数字の合計は %d です。",iSum);
break;
case 3:
iReb = 0;
while(iCnt < iLen)
{
iCnt++;
sprintf(sBuf,"%s%c",sBuf,sInput[iLen-iCnt]);
}
iReb = atoi(sBuf);
printf("入力された数字の逆順は %d です。",iReb);
break;
}
return 0;
}

こんな感じでいいのかな?

#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#include "math.h"

int main(int argc, char* argv[])
{

char sInput[32];
int iInput=0;
int iLen=0;
int iMod=0;
int iSum=0;
int iReb=0;
int iCnt=0;
char sBuf[32];

memset(sInput,0,sizeof(sInput));
memset(sBuf,0,sizeof(sBuf));
scanf("%s",&sInput);
iLen = strlen(sInput);

if( iLen > 9 || iLen < 5 )
{
...続きを読む

QC++のフリーソフト、使い方がわからなくて・・・

Visual C++ 2005 Express Edition 日本語版
をマイクロソフトHPからダウンロードしたのですが、これを開いた後、
‘どこでプログラムを書き、どこで実行するのか’がわかりません。
マニュアル的なものも探しましたが、みつからず・・・。

お時間ある方、教えていただけないでしょうか。
よろしくお願いします。

Aベストアンサー

Visual C++の無料版は試したことが無いので、おそらくですが…
"ファイル"から"新規作成"で、必要に応じたプロジェクトを作成すれば可能だと思います。
その後は"プロジェクト"⇒"プロジェクトに追加"⇒"新規作成"で、ソースファイルを追加してください。

ですが、書店などでVCを教材として使っている本を買うのが一番確実だと思います。
amazonなどで"VisualC++"で検索してみてください。

参考URL:http://www.amazon.co.jp/

Qfoo1.txt、foo2.txt、foo3.txt…とファイル名をつけたいとき

プログラムの一部でファイルを作成しておりまして、
foo1.txt、foo2.txt、foo3.txt…のように
foo+変数.txtとなっており、変数を変える(増やす)ことで複数のファイルを作っていきたいのですが、

このように作成したいファイル名の途中に変数を含んでいる場合、どのようにすればよいのかをご教授願います。

現在、ファイルを作成する関数(関数の中身はおそらく関係してこないと思うので割愛させていただきます)を作成し、
make("foo.txt")のように記述しておりますが詰まってしましました。
どうぞ宜しくお願いします。

Aベストアンサー

つまり
char str[16];
int count;
for(count = 0; count < 10; count++)
{
sprintf(str,"foo%d.txt",count + 1);
}
とすると
strにファイル名が入っている。


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

人気Q&Aランキング

おすすめ情報