• ベストアンサー

表示がおかしくなる

ファイルdata.txtの内容を読み込んで出力するプログラムです。ファイルの内容と一致しません。どうしてでしょうか?? ■プログラム #include<iostream.h> int main(void){ FILE *fp; char ch; int n,m,a,b,c,d; char in[2]; if(( fp = fopen("data.txt","r")) == NULL){ cout << "error!" << endl; exit(1); } while(fscanf(fp,"%d,%d,%s", &n,&m,&in) != EOF){ cout << "n=" << n << ",m=" << m; cout <<",in=" << in; cout << endl; } return 0; } ■data.txt 19980105,0101,ys 19980105,0201,dd 19980105,1301,rg 19980105,1301,ab 19980105,1301,gr 19980105,1319,or ■実際に表示されたもの n=19980105,m=0,in=ys n=19980105,m=0,in=dd n=19980105,m=1280,in=rg n=19980105,m=1280,in=ab n=19980105,m=1280,in=gr n=19980105,m=1280,in=or mがおかしくなってしまっているのが分かります。

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

char in[2]; を char in[3]; にする現状ではメモリがあふれていると思われる。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • Trick--o--
  • ベストアンサー率20% (413/2034)
回答No.3

びふぉー cout << "n=" << n << ",m=" << m; cout <<",in=" << in; cout << endl; ぱっと見で何をしているか理解しにくい。 #2さんのC書式でもいいが、sprintfを使うだけでも違うだろう。 あふたー char szBuf[LENGTH]; // LENGTHは適当に。 sprintf(szBuf, "n=%d, m=%d, in=%s", n, m, in); cout << szBuf << endl; すっきりしたでしょう。 致命的な修正点はすでに指摘されているので、そちらを参考に。

全文を見る
すると、全ての回答が全文表示されます。
  • mac_res
  • ベストアンサー率36% (568/1571)
回答No.2

>while(fscanf(fp,"%d,%d,%s", &n,&m,&in) != EOF){ inが溢れているだけでなく、inは文字配列なので、&は不要。 ほかにも、a,b,c,d,chは未使用。coutを使うことで、全体に見苦しいプログラムになっている。 こんなことなら、Cの書式で書いたほうがまし。 -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- 8< -- include<stdio.h> #include<stdlib.h> #include<errno.h> int main(void){ FILE *fp; int n,m; char in[BUFSIZ]; if(( fp = fopen("data.txt","r")) == NULL){ fprintf(stderr, "Can't open data.txt\n"); exit(errno); } while(fscanf(fp,"%d,%d,%s", &n,&m,in) != EOF){ printf("n=%d,m=%d,in=%s\n", n,m,in); } return 0; }

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • char型変数のアドレスを coutで表示するには

    #include <iostream> using namespace std; int main() { bool b; int i; short s; long l; float f; double d; char c; //上で宣言した変数のアドレスを表示 cout << "bool &b " << &b << endl; cout << "int &i " << &i << endl; cout << "short &s " << &s << endl; cout << "long &l " << &l << endl; cout << "float &f " << &f << endl; cout << "double &d " << &d << endl; cout << "char &c " << &c << endl; //「char &c 」とのみ表示される cout << '\n'; //char型のみ printf で再表示 printf("char &c %p\n", &c); //「char &c ********」と表示される return 0; } 上のプログラムを実行すると cout << "char &c " << &c << endl; のところだけ、アドレスが表示されません。 printfを使えば、char型の変数のアドレスも表示されるのですが…。 coutを使ってchar型のアドレスを表示させるにはどうすればいいのでしょうか。 よろしくお願いします。

  • うまく実行ができない(相関図)

    C++で二次元配列を勉強しています。そこで二次元配列を使用して相関図をつくるプログラムの問題をやっているのですが、自分なりにプログラムをつくったところ、コンパイルはできるのですが実行すると無限ループがおこり、うまく実行できません。いくら考えてもなにがいけないのかわからないので質問させていただきました。 下のは読み込むデータファイル例とその実行例です http://kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/5254.txt 以下はつくってみた間違いプログラムです #include<iostream> #include<string> #include<iomanip> #include<fstream> using namespace std; int main() { int data; string filename,Madata,Endata; int i=0,j=0,x=0,y=0,m=0,n=0,num=100; char* graph[21][21]; ifstream fin; cout << "This program's spec:"<< endl; cout << "point range=(0-100) div=5 leftspace=4 divspace=3" << endl; cout << "Input data File Name!:"; cin >> filename; fin.open(filename.c_str()); if(!fin) { cerr << "指定されたファイルを開けません" << endl; return 1; } while(fin >> data) { Madata[i]=data; fin >> data; Endata[i]=data; i++; } for(m=0; m<21; m++) { for(n=0; n<21; n++) { graph[m][n]=" "; } } for(m=0; m<i; m++) { x=Madata[m]/5; y=Endata[m]/5; graph[x][y]="*"; } for(x=0; x<21; x++) { cout << setw(3) << num << "|"; for(y=0; y<21; y++) { cout << setw(3) << graph[x][y]; } cout << endl; num=num-5; } cout << "----------------------------------------------------------------------" << endl; cout << setw(3) << "|"; for(num=0; num<=100; num+5) { cout << setw(3) << num; } cout << endl; return 0; } 上記のプログラムだと0の無限ループになります。 長々となりましたが、時間のある方教えてください、よろしくおねがいします

  • 段落毎に配列に挿入するには?

    C++の基本的な配列でわからないことがあります。 例えば以下のような,3段落があるテキストファイルを用意しておき, -------------- //abc.txt abcde fghij klmno -------------- 用意した配列char data[3][20]へ, 上から順番にdata[0]に"abcde",data[1]に"fghij",data[2]に"klmno"を挿入したいです。 とりあえず1行だけ,以下のようなプログラムで出力表示できました。 #include <string> #include <iostream> using namespace std; int main() { char cir_data[3][20]; string filename("abc.txt"); FILE* fp = fopen( filename.c_str(), "r" ); fgets(data[0], 20, fp); cout << data[0] << endl; fclose(fp); return 0; } 結果は, -------------------- abcde -------------------- となったので,2・3番目もforループでできるかなと思ったら,良い結果が出ません。 以下は間違えているプログラムです。 int main() { char cir_data[3][20]; int i; string filename("abc.txt"); FILE* fp = fopen( filename.c_str(), "r" ); for(i=0; ; ){ fgets(cir_data[i], 20, fp); if(strlen(cir_data[i])<3) break; if(cir_data[i][0] != '/') i++; cout << cir_data[i] << endl; } fclose(fp); cout << "i = " << i << endl; return 0; } 結果は文字化けしてます。 何回ループしたか,iも出力してみましたが,なぜか6回カウントされています。 どこが誤っているのかわからず困っています。

  • 値によって組み分けを作成するプログラムについて

    こんにちは。 プログラミングでつまってしまったため質問させて頂きます。 プログラミング言語はC++です(visual c++ではありません)。 ■作成したいプログラム A,B,C,D,Eがある。 AとBの類似度は91% 以下同様に AとCは89% AとDは79% AとEは77% BとCは93% BとDは97% ・・・のように続いていく.. (*ABが似ている、BCが似ている。だからと言ってACが似ているとは言えない。) この中で、類似度が閾値以上である場合は同じ組とする。 ただし、複数のパターンが考えられる場合は組の数が一番すくなくなるように作る。 ■プログラムの動作イメージ 例1: 閾値=0.90 //入力データ 01 = 0.91; OK 02 = 0.90; OK 03 = 0.78; NG 04 = 0.83; NG 12 = 0.94; OK 13 = 0.78; NG 14 = 0.77; NG 23 = 0.78; NG 24 = 0.69; NG 34 = 0.94; OK OKなのは,01,02,12,34 つまり以下のような出力が得られる >>0,1,2 >>3,4 --------------------------------------- 例2: 閾値=0.90 //入力データ 01 = 0.91; OK 02 = 0.90; OK 03 = 0.94; OK 04 = 0.83; NG 12 = 0.95; OK 13 = 0.78; NG 14 = 0.77; NG 23 = 0.78; NG 24 = 0.69; NG 34 = 0.94; OK OKなのは,01,02,03,12,34 つまり 0,1,2 3,4 or 0,3 1,2 4 となった場合は、組数の少ない上を選択する。 従って以下のような出力が得られる。 >>0,1,2 >>3,4 --------------------------------------- 例3: 閾値=0.90 //入力データ 01 = 0.91; OK 02 = 0.90; OK 03 = 0.78; NG 04 = 0.83; NG 12 = 0.77; NG 13 = 0.78; NG 14 = 0.77; NG 23 = 0.78; NG 24 = 0.69; NG 34 = 0.94; OK OKなのは,01,02,34 この場合は、01と02は閾値を超えているが、12は閾値を超えていないため、 0,1,2を同じ組とはできない。 従って以下の2パターンが考えられる。 0,1 2 3,4 or 0,2 1 3,4 この場合は組の数は同じなのでどちらが出力されてもOK。 番号の若いものから出力されるとすると以下のような出力が得られる。 >>0,1 >>2 >>3,4 ------------------------------------------------------ 以上のようなプログラムを作成したいです。 自分で考えてみたのプログラムが以下のものです。 01,02,12,34は閾値を超えているということまではできたのですが、その後のグループの作り方のところで詰まってしまいました。 そこで、上記のような動作をするプログラムについて教えていただきたいです。 よろしくお願い致します。 int main(){ //閾値 double THRESHOLD = 0.9; //dataを格納する配列 double in_data[5][5] = {0}; //group_flagを格納する配列 bool group_flag[5][5] = {0}; in_data[0][1] = 0.91; in_data[0][2] = 0.90; in_data[0][3] = 0.78; in_data[0][4] = 0.83; in_data[1][2] = 0.94; in_data[1][3] = 0.78; in_data[1][4] = 0.77; in_data[2][3] = 0.78; in_data[2][4] = 0.69; in_data[3][4] = 0.94; //組の番号を格納する配列    //group[3]=2だったら、データ3はグループ2に入る int group[5]; int i=5; //データ数 int num=0; for(int n=0; n<=i; n++){ for(int m=n+1; m<i ;m++){ cout << "in_data[" << n << "][" << m << "]=" << in_data[n][m] << endl; if(in_data[n][m] >= THRESHOLD){ cout << "OK" << endl; group_flag[n][m] = 1; } } } for(int n=0; n<=i; n++){ for(int m=n+1; m<i ;m++){ if(group_flag[n][m] == 1){ cout << n << m <<endl; } } } }

  • newかFILEでエラーのような

    エラーがおこらないと思うんだけど、実行時エラーです。 コンソールアプリケーションのソースを見てください。 fclose(fp); を2行上に移動した場合はエラーにはなりません。 これはどうしてエラーになるんですか? test.txtは、同じディレクトリにある0バイトのファイルです。 #include <windows.h> #include <iostream.h> int main(){  WIN32_FIND_DATA finddata;  FILE *fp;  char *str;  char **pp;  FindClose(FindFirstFile("test.txt", &finddata));  fp = fopen("test.txt", "r");  if(fp){   str = new char[14];   fclose(fp);   strcpy(str, "abcdefghijklm");   pp = new char*[3];   pp = &str;   delete [] *pp;   delete [] str;  }else cout << endl;  return 0; }

  • VC++でプログラムの勉強をしています。

    プログラムは最近はじめたばかりです。While文とif文を使ってクイズを作ってみたところ、一個目のsinで入力を求めているところから無限ループになってしまいました。色々調べてcin.cler()とsin.ignore()を入れたりもしてみましたが上手くいきませんでした。どこを間違えているのでしょうか? //クイズ #include <iostream> using namespace std; int main()//cin.clear();cin.ignore();???? { int a; int b; while(1) { cout<<"ネコ型のロボットが出てくるアニメといえば?"<<endl; cout<<"A)ドラえもん B)ドラエもん C)ほりえもん D)サザエさん"<<endl; cin>>a; if(a=='A') { cout<<"ファイナルアンサー?"<<endl; cout<<"Y)Yes N)NO"<<endl; cin>>b; if(b=='Y'){break;} if(b=='N'){cout<<"ゆっくり考えてね!!"<<endl;} if(b!='Y'||'N'){cout<<"正しく入力してね!"<<endl;} } if(a=='B'||'C'||'D') { cout<<"ファイナルアンサー?"<<endl; cout<<"Y)Yes N)NO"<<endl; cin>>b; if(b=='Y'){cout<<"残念!!"<<endl;} if(b=='N'){cout<<"ゆっくり考えてね!!"<<endl;} } if(a!='A'||'B'||'C'||'D'){cout<<"正しく入力してね!"<<endl;} } cout<<"正解!!"<<endl; }

  • プログラムの連続実行(VC++ 2010)

    こんにちは。 現在、「Visual C++ 2010 Express」を使って、コンソールアプリケーションの開発について勉強しています。 どうしてもわからないことが出てきたので、質問させて下さい。 今、Sという名前のソリューションに、P1とP2という、2つのプロジェクトが含まれているとします。 P1をビルドして作成されたP1.exeは、1つのファイルに、適当なデータを出力します。 P2をビルドして作成されたP2.exeは、そのファイルの内容を読み取って、標準出力に出力します。 Visual C++ 2010 Expressでは、[Ctrl]+[F5]で、作成されたexeファイルを実行できるのですが、 どうやら、スタートアッププロジェクトのexeファイルしか実行されないようなんです。 [Ctrl]+[F5]によって、P1.exeが実行された後に、P2.exeが実行されるようにするには、どうすればよいのでしょうか? プロジェクトやソリューションのプロパティをいじってみたのですが、 どうも上手くいかなかったので、質問させて頂きました。 一応、P1とP2のソースファイルの内容を、以下に載せておきます。 ・P1.cpp ----------------------------------------------- int main(int argc, char *argv[]) { char str[1000]; //出力用にファイルをオープンする。 ofstream fw("file.txt"); if(!fw){ cout<<"「file.txt」が開けない!\n"; exit(1); } //ファイルにデータを書き込む。 cout<<"出力ファイルに書き込む文字列を入力せよ。"<<endl; cin>>str; fw<<str<<endl; fw<<100<<endl; fw<<200<<endl; fw.close(); return 0; } ----------------------------------------------- ・P2.cpp ----------------------------------------------- int main(int argc, char *argv[]) { char ch; //読み取り用にファイルをオープンする。 ifstream fr("file.txt"); if(!fr){ cout<<"「file.txt」が開けない!\n"; exit(1); } cout<<"file.txtの内容を読み込み、以下に表示する。\n"; while( fr.get(ch) ){ cout<<ch; } return 0; } ----------------------------------------------- ちなみに、各プロジェクトの「作業ディレクトリ」は、 共通のディレクトリに設定しているので、 「file.txt」は、そこで入出力されるようになっています。 以上、よろしくお願い致します。

  • c++11での文字列リテラルの特殊化について

    c++11言語でのテンプレート部分特殊化についての質問です。 コメントアウト部分は出力結果です template<class T> struct VT { static const int type = 1;}; template<class T,int N> struct VT< T[N] > { static const int type = 2;}; template<class T,int N> struct VT< const T[N] > { static const int type = 3;}; template<class T> struct VT< T* > { static const int type = 4;}; template<class T> struct VT< const T*const > { static const int type = 5;}; #include<iostream> #include<typeinfo> int main(){ std::cout<<"A:"<< VT< char >::type << std::endl; // A:1 std::cout<<"B:"<< VT< char[10] >::type << std::endl; // B:2 std::cout<<"C:"<< VT< char* >::type << std::endl; // C:4 std::cout<<"D:"<< VT< char const [1] >::type << std::endl; // D:3 std::cout<<"E:"<< VT< decltype("") >::type << std::endl; // E:1 std::cout<<"G:"<< typeid( char const [1] ).name() << std::endl;// G:char const [1] std::cout<<"H:"<< typeid( "" ).name() << std::endl;// H:char const [1] } 型名を直接記述したD,G、文字列リテラルを記述したE,H。 コンパイラ毎の差はあれど、GとHの型名は同じものが表示されます。 ですが、[D:3] [E:1]と値は違い、別の特殊化テンプレートが使われています。 この部分が分かりません。 また、配列リテラル、文字列リテラルに対し部分特殊化テンプレートを宣言する方法などありましたら、ご教示お願いします。

  • 複数ファイルの出力

    質問があります。1600個のデータを読み込んで(16個ずつの組で100組)、1番目、3番目、5番目、7番目のデータをss[1].txtとして出力し、同様に2番目、4番目、6番目、8番目のデータをsk[1].txt、9番目、11番目、13番目、15番目のデータをks[1].txt、10番目、12番目、14番目、16番目のデータをkk[1].txtとして出力させます。以下、ss[2].txt,sk[2].txt,ks[2].txt,kk[2].txt・・・に関してはそれぞれ直前のファイルに16を足したデータ(例えばss[2].txtなら、17番目、19番目、21番目、23番目のデータを出力)を出力させるというプログラムです。 以下に自分で作ったプログラムを掲載します。 void ecg_rr(fp,data_max) FILE *fp; { int i,j=0; int c=1; char fname[64]; data[0][i]=trend_data[0][i]; for(i,j=0;i<100,j<100;i++,j++) { sprintf(fname,"ss[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][0+j*16]); fprintf(fp,"%8.8f\n",data[0][2+j*16]); fprintf(fp,"%8.8f\n",data[0][4+j*16]); fprintf(fp,"%8.8f\n",data[0][6+j*16]); sprintf(fname,"sk[%d].txt",1+i); fp = fopen(fname,"w"); fprintf(fp,"%4d\n",c); fprintf(fp,"%8.8f\n",data[0][1+j*16]); fprintf(fp,"%8.8f\n",data[0][3+j*16]); fprintf(fp,"%8.8f\n",data[0][5+j*16]); fprintf(fp,"%8.8f\n",data[0][9+j*16]); fclose(fp); /*ks,kkに関しても同様*/ } } これだと100個ずつファイルを出力できるのですが、データが全て0として出力されてしまいます。

  • C++

    今、下のようなプログラムを作っています #include <iostream> #include <iostream> using namespace std; int i=0, c=0, n; char str[10]; class X16karax10{ //16進から10進ヘ public: void keisan(); }; void X16karax10::keisan(void){ cout<<"16進を入力して下さい"<<endl; cout<<"英数字は大文字で入力してください(F→○ f→×)" <<endl; scanf("%s",str); while(str[i] != '\0'){ n = n * 0x10; c = str[i++]; if((c >= '0') && (c <= '9')){ n += c - '0'; } else if((c >= 'A') && (c <= 'F')){ n += c - 'A' + 10; } } cout<<("%d\n",n)<<"です\n"<<endl; } int main(){ for(i=0; ; i++){ X16karax10 p; p.keisan(); } } 16進を十進に変えるものなのですがreturn 0を使うと「X16karax10::keisan()' は値を返せない」と、でてしまうのですがどうしたらよいでしょうか?

MFC-J6983CWDで印刷が出ない
このQ&Aのポイント
  • MFC-J6983CWDを使っていますが、印刷指示を出しても反応しません。
  • 手差しトレイに用紙をセットしてもエラーメッセージが消えず、印刷ができません。
  • PC側では自動選択が設定されているため、改善方法を教えてください。
回答を見る

専門家に質問してみよう