ifstreamの使い方

このQ&Aのポイント
  • C++のifstreamを使用して、Txtファイルからデータを読み込み、コンソールに表示するプログラムを作成しています。
  • しかし、プログラムの実行中にEOFに達してしまい、途中で終了してしまいます。
  • どのようにすれば、すべての行を読み込むことができるのでしょうか?
回答を見る
  • ベストアンサー

ifstreamの使い方

Txtファイルからデータを読んでコンソールにそのデータを表示する簡単なプログラムを作っているのですが、21行中14行目でおそらくEOFになってプログラムが終了してしまいます。どうやったら全部の行を読めるようになるのか、教えてください。お願いします。 int main() { //データを表示するための関数 void outputline(char*, int, int, char*); int i = 0;  char FlNo[8], FlType[5]; int Hr, Min; ifstream inFile (conFilePath, ios::in); while (inFile >> FlNo >> Hr >> Min >> FlType) { outputline(FlNo, Hr, Min, FlType); } return 0; } 以下はconFilePathに書かれているデータの内容です。 TG24 06 00 A747 UA345 06 05 A747 KL903 06 10 A747 CX600 06 15 A747 QF34 06 20 A767 QF100 06 25 A767 QF302 06 30 A747 JL98 06 35 A747 QF92 06 40 A767 PX03 06 45 A777 EM786 07 00 A777 SQ165 07 20 A747 QF98 07 30 A767 BA56 08 00 A747 QF97 09 30 D767 PX08 09 45 D777 QF303 09 50 A747 TG25 10 20 D747 QF6 10 45 D747 BA57 10 50 D747 SQ166 10 55 D747

質問者が選んだベストアンサー

  • ベストアンサー
  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.2

> setbaseを使うためにはiomanip.hを宣言すれば良いんですよね? そうです。 > ifstream inFile (.....); > inFile >> setbase(10); > ということでしょうか? そうです、こっちです。 読込む度に入れるとしたら dec というマニピュレータを使います。 こんな感じ。   while (inFile >> FlNo >> dec >> Hr >> dec >> Min >> FlType) { ん、「同じエラーが」と書いたのは、コンパイルエラーのことですか? STL は、Standard と名前がついていても、実装の種類がたくさんあります。 そのあたりの差かもしれません。 手元にある VC4.2 の iostream を見ると、setbase マニピュレータがありません。 dec マニピュレータはあるので、そちらを使ってみてください。 VC4.2 では dec マニピュレータは ios.h で宣言されているので、iomanip.h は include しなくても良いです。手もとの環境を確かめて見てください。

northcurlcurl
質問者

お礼

VC++6.0を使っています。decを使って書いたところ、うまくプログラムが動きました。ありがとうございました。 PS. setbase()がなぜ動かなかったかは未だに不明です…

その他の回答 (1)

  • a-kuma
  • ベストアンサー率50% (1122/2211)
回答No.1

> BA56 08 00 A747 この行を読もうとするときに 08 でエラーになります。 数値の定数表現を思い出してください。頭に 0x をつけると 16進数、頭に 0 をつけると 8進数表記になります。 istream は、特に指定が無ければ、この表記に基づいて整数の解釈をします。 これを明示的に 10進数だ、とするには setbase() マニピュレータを使います。 コンストラクタの直後に   inFile >> setbase(10); という行を追加してください。

northcurlcurl
質問者

お礼

早速の回答、ありがとうございます。setbaseを使うためにはiomanip.hを宣言すれば良いんですよね?すごく恥ずかしい質問なのですが、setbaseのところでundeclarerd identifierと、エラーが出るのです。setbaseはコンストラクタの直後に、とa-kumaさんは書かれていますが、それは ifstream inFile (.....); inFile >> setbase(10); ということでしょうか?それともwhileループの条件文で inFile >> FlNo >> setbase(10) >> Hr >> setbase(10) >> Min >> FlType とするのでしょうか?どちらにしても、同じエラーが出てしまったのです。何が原因なのでしょうか?

関連するQ&A

  • 固定幅フィールドのテキストデータをifstreamを使って読み込む方法

    固定幅フィールドのテキストデータをifstreamを使って読み込む方法 について教えてください。 計算結果の出力ファイルに1行につき8カラム、20カラム、10カラムのデータがあるとします。 例えば 1.2345671.2345678912345678911.23456789 このデータ行には 1.234567(8カラム幅) 1.234567891234567891(20カラム幅) 1.23456789(10カラム幅) の3つの固定小数点の数字が書かれています。 上記例のように3つ(複数)の数字が必ずしもホワイトスペース区切りにはなっていないものとします。 これをC++標準ライブラリのifstream や stringstreamを用いて読み込む場合、どのような記述をしなければならないのでしょうか? たとえば、 int main(int argc, char** argv) { double data[3]; char buf[BUFSIZ]; ifstream ifs( argv[1] ); // argv[1] には上記データが書かれたファイル名が入っているとします。 stringstream str; while( !ifs.eof() ) { if( !ifs.getline( buf, BUFSIZ, '\n' ) ) break; str << buf; str >> setw(8) >> data[0] >> setw(20)>> data[1] >> setw(8) >> data[2]; } cout << data[0] << " " << data[1] << " " << data[2] << endl; return 0; } のような書き方だと、以下のように出力されてしまい、幅を指定しているsetw()が効いていません。 1.23457 0.234568 0.234568 恐らく、'.'がセパレータとして使われて読み込まれているものと思います。 sscanf( buf, "%8lf%20lf%10lf", &data[0], &data[1], &data[2] ); を使うしか方法が無いのでしょうか? 開発環境は ubuntu上のg++ 4.4.3 です。

  • プログラミング教えてください!!!お願いします。

    プログラミング教えてください!!!お願いします。 次の文が実行されると何がどのようにプリントされるか。何もプリントされない時は「なし」と記せ。 また、途中に「ブランク」が入る場合は、”b”と記せ。 (1) int func1(), func2(); int data = 100; main() { int w = 1; static x =10; printf("** %d, %d, %d\n" ,w,x,data); func1(); printf("** %d, %d, %d\n" ,w,x,data); } int func1(){ int w = 2; static int x = 20: printf("*** %d, %d, %d\n", w, x, data); x += 10; func2(); printf("*** %d, %d, %d\n" , w,x,data); x *= 2; data = data - x; } int func2() { int w = 3; static int x = 30; printf("**** %d, %d, %d\n" ,w,x,data); data -= x; } (2) int func1(char *, char *, char *); int func2(char *, char *, char *); main() { char sta[20], stb[20], stc[20], std[20]; int i=0; func1("abc","xyz",sta); printf("%d -- %s\n" ,++i,sta); func1("123","456",stb); printf("%d -- %s\n" ,++i,stb); func1(sta,stb,stc); printf("%d -- %s\n" ,++i,stc); func2(sta,stb,std); printf("%d -- %s\n" ,++i,std); } int func1(char *a, char *b, char *c){ while(*a) *c++ = *a++; while(*b) *c++ = *b++; * c = 0x00; } int func2(char *a, char *b, char *c){ int i = 0; while(*b){ if(i%2 == 0) *c++ = *a++; else *c++ = *b++; i++; } *c = 0x00; }

  • 関数でエラー

    #include<stdio.h> int func(int, int); int main() { int a, b, c; a = 10; b = 20; c = func(a, b); printf("%d x %d" = %d\n", a, b, c) return 0; } int func(int a, int b) { int c; c = a * b; return c; } エラーが出てしまうのですが、どうしてエラーが出るのか教えて頂けないでしょうか? エラー一覧です。 ------------------------------------------------------------------------------------------------------------------------------- 配列型 const char[8]を割り当てることはできません。 14行目 ;がreturnの前にありません              16行目 式は変更可能な左辺値である必要があります      14行目 ;が必要です                     16行目 よろしくお願いします。

  • char型+char型ってint型? if(char型==int型)?

    C言語の「汎整数拡張(インテグラルプロモーション)」というものに関するものだと思います。 char型とchar型を加えた結果は、char型でしょうか。それともint型でしょうか。 (下のプログラムの printf("sizeof(a[0]+a[1])は%d\n", sizeof(a[0]+a[1])); /* char型+char型 */ という部分の結果は4なので、int型と考えるべきなのかな。) 私は、char型とint型の加算の結果はint型だと思っていましたが、 char型とchar型の加算の結果はやはりchar型だと思っていました。 (それが間違えているのでしょうか。) if(a[0]==i) /* char型とint型の比較(?) */ の部分では、左辺はchar型、右辺はint型ですが、このように型の違う変数を比較しても文法上構わないのでしょうか。 (私は、「比較は必ず型の同じもの同士でしかできない」と思っていました。) 左辺はchar型のように見えて、じつはint型ですか。 #include <stdio.h> int main(void) { char a[4]; int i=77; printf("sizeof(int)は%d\n", sizeof(int)); printf("sizeof(char)は%d\n", sizeof(char)); printf("sizeof('M')は%d\n", sizeof('M')); printf("sizeof(a[0])は%d\n", sizeof(a[0])); a[0]='M'; a[1]=7+6; a[2]=a[0]+a[1]; printf("sizeof(a[0]+a[1])は%d\n", sizeof(a[0]+a[1])); /* char型+char型 */ printf("sizeof(+a[0])=%d\n", sizeof(+a[0])); if(a[0]==i) /* char型とint型の比較(?) */ puts("a[0]==i"); else puts("a[0]!=i"); return(0); } ちなみにワーニングもエラーもなんにもでません。

  • char型・int型を相互変換させるプログラミング

    今、C++で2つのPC間で数値データの送受信を出来るようにしようと思い、実際にデータを飛ばせるところまで来たのですが、送れるデータの型はchar型のみであるとのこと。 ですので、intの値を一旦charにして送り、送った先でまたintにしたらいいかなと考えてプログラミングしました。 簡単にできると思ったのですが、上手くいきません・・・。プログラムのどの部分が間違っているのでしょうか? 一人では、これ以上悩んでも好転しないので、皆さんのご指導をお願いします 以下プログラム抜粋、このプログラムでは型変換がおこなわれているかの確認ができればいいので、それのみでプログラミングしています =================================================== #include <stdio.h> #include <stdlib.h> #include <string> #include <iostream> int main() { int a=123; char *b=new char; int c=1; //変換部分 *b=(char)a; std::cout<<"int→char>>>"<< c << "\n"; //逆変換部分 d=atoi(c); std::cout<<"char→int>>>"<< d << "\n"; } ======================================================

  • ファイルから読み込むC言語の問題

    C言語の問題です。 file.txtを読み込む。 データの値を奇数と偶数に分け、それぞれ合計値・個数・平均値を出力せよ。 奇数データの数・偶数データの数がゼロの場合は、平均値を求めないようにしなさい。 file.txtの中身は「10 11 8 21 6 8 13 26 9 3」です。 #include <stdio.h> #define SIZE 10 int main(void) { FILE *infile; int i, data[SIZE]; int ksum, knum, gsum, gnum; ksum = 0; gsum = 0; infile = fopen("file.txt", "r"); if(infile == NULL) { printf("入力ファイルを開くことができません\n"); else{ fscanf(infile, "%d"); if(data[i]%2){ ksum += data[i]; knum += 1; } else if(data[i]/2==0){ gsum += data[i]; gnum += 1; } } return 0; } for(i = 0; i < SIZE; i ++ ) { fscanf(infile, "%d", &data[i]); } for(i = 0; i < SIZE; i ++ ) { printf(" %3d", data[i]); } printf("%d %d %f", ksum, knum, (double)ksum/knum); printf("%d %d %f", gsum, gnum, (double)gsum/gnum); return 0; } このように考えたのですが、うまく実行できません。 間違っている箇所やその修正方法などを教えていただけたら嬉しいです。 ちなみに16行目で「else 文が if と一致しません。」というエラーが出てしまいます。 もうひとつ「奇数データの数・偶数データの数がゼロの場合は、平均値を求めない」というのはどのように表せば良いのでしょうか? ご指導よろしくお願いします。

  • プログラミング(C言語)についての質問です

    3つの整数の入力を受け付け、最大と最小を求める関数を作成し得られた結果を表示するプログラミングを作成したつもりなのですが、うまく作動しません。(コンパイルはできますが、結果が無茶苦茶になります。) ご教授宜しくお願いします。 それと、課題文にはポインタを使って最大値と最小値を同時に求めるようにと書いてあったのですが、それもよくわからないです。 今回初めてポインタと配列の受け渡しについて習ったのでよくわかっていない部分も多いと思うのですが、何卒宜しくお願いします。 ちなみに関数の形自体は void minmax(int data[],int *min,int *max){} で決まっています。 #include <stdio.h> void minmax(int data[],int *min,int *max){ int i; *min=*max=data[0]; printf("1st intenger:"); scanf("%d",&data[0]); printf("2st intenger:"); scanf("%d",&data[1]); printf("3st intenger:"); scanf("%d",&data[2]); for(i=1;i<3;i++){ if(*max<data[i]){ *max=data[i]; } if(*min>data[i]){ *min=data[i]; } } } int main(void){ int data[3],min,max; minmax(data,&min,&max); printf("最小値は%dで最大値は%dです",min,max); return 0; }

  • 配列の中身を入れ替える方法を教えてください

    配列の中身を入れ替える方法をどなたかおしえてください。下のプログラムはちゃんと実行されるんですが、いまいち納得できません。 特に・・・↓↓ void sort(int a[]) { int x,y,z,min; for(x=0;x<10;x++) { min=x; for(y=x;y<10;y++) { if(a[min]>a[y]) { min=y; } } z=a[min]; a[min]=a[x]; a[x]=z; } } 上の部分でなぜfor文を2回使うのか?2回目のfor文のところはなぜ y=xなのか?0ではいけないのか?よくわかりません。一番最後の入れ替え作業のところは納得できたんですが、for文のところがよくわからないのでどなたか分かる方教えてください! #include "stdafx.h" #include <stdio.h> #include <stdlib.h> #include <time.h> void sort(int a[]) { int x,y,z,min; for(x=0;x<10;x++) { min=x; for(y=x;y<10;y++) { if(a[min]>a[y]) { min=y; } } z=a[min]; a[min]=a[x]; a[x]=z; } } int main(int argc, char* argv[]) { int a[10],b,c; srand((unsigned)time(NULL)); for(b=0;b<10;b++) { a[b]=rand(); c=a[b]; printf("a[%d]=%d\n",b,a[b]); } sort(a); for(b=0;b<10;b++) { printf("小さい順a[%d]=%d\n",b,a[b]); } return 0; }

  • C++の関数テンプレートで分からないところがあります。

    C++の関数テンプレートで分からないところがあります。 C++の入門書を読んで勉強しているのですが、その演習問題(答えはついてないです)で、以下のような問題がありました。 ----------------------------------------------------- 配列の全要素の最小値を求める関数テンプレートを作成せよ。 teplate <class Type> Type minof(const Type x[], int n); という形で作ること。 なお、最も小さい文字列を求められるようにするために、const char *型に明示的に特殊化したものも合わせて作成すること。 ------------------------------------------------ という問題なのですが、これにたいして僕は以下のように答えました。ヘッダのインクルードなどは省きます。 template<class Type> Type minof(const Type x[], const int n) {     int min = 0;     for(int i = 1; i < n; i++)         if(x[min] < x[i])             min = i;     return x[min]; } template<> const char* minof<const char *>(const char x[][64], const int n) {     int min = 0;     for(int i = 1; i < n; i++)         if(strcmp(x[min], x[i]) < 0)             min = i;     return x[min]; } int main() {     const int n = 5;     int a[n];     char s[n][64];     for(int i = 0; i < n; i++){         cout << i + 1 << "番目---";         cin >> a[i];     }     cout << "文字列\n";     for(int i = 0; i < n; i++){         cout << i + 1 << "番目---";         cin >> s[i];     }     cout << "整数の最小値---" << minof(a, n) << "です\n";     cout << "文字列の最小値---" << minof<const char *>(s, n) << "です\n"; } これをコンパイルすると、エラーで 明示的な特殊化; 'const char *minof<const char*>(const char [][64],const int)' は関数テンプレートの特殊化ではありません と 'minof' : 1 番目の引数を 'char [5][64]' から 'const char *const []' に変換できません。 とでてしまいます。 色々探してみたのですが、解決できませんでした・・。 特に最初のほうのエラーがよくわかりません。ちゃんと特殊化してる気はするのですが・・。 間違っている箇所の正当を載せていただけるとわかりやすくて、ありがたいです。 よろしくお願いします!

  • C言語 関数の中でカウントアップするには

    Cプログラムで関数を呼び出すたびに関数の中でカウントアップ(line変数)したいと思っています。 しかし下記記述だとカウントアップされません。 記述をどのように変更すればよいか分からないでいます。 ご助言戴ければ幸いです。 宜しくお願いします。 ◉入力ファイル(aaa、3行、1行1byte) 11 11 11 ◉Cプログラム void get_bgr(); main(argc, argv) int argc; char **argv; {                int line; line = 0; size = 1; num = 1; unsigned char buf[1024]; infile[0] = fopen("aaa", "r"); while( fread(buf, size, num, infile[0]) == num){ get_bgr(line); printf("line2=%d\n",line); }        void get_bgr( line )          int line; { line++; printf("line1=%d\n",line); } ◉出力結果   line1=1   line2=0   line1=1   line2=0   line1=1   line2=0 ◉期待値   line1=1   line2=1   line1=2   line2=2   line1=3   line2=3

専門家に質問してみよう