プログラムのファイルが開けない原因と改善方法

このQ&Aのポイント
  • Visual Studio 2013ではファイルが開けず、終了してしまうが、MinGWでは正常に動作する理由は何か?原因と改善方法を教えてください。
  • Visual Studio 2013でファイルが開けない問題が発生し、プログラムが途中で終了するが、MinGWでは正常に動作する理由を教えてください。また、改善方法も教えてください。
  • Visual Studio 2013でファイルが開けない現象が発生し、プログラムが終了してしまうが、MinGWでは正常に動作する理由はなぜでしょうか?原因と改善方法を教えてください。
回答を見る
  • ベストアンサー

自分で作成したプログラムについて…。

visual stdio 2013 デスクトップ版のものを使い、下に書くプログラムを作ったのですが、 visual stdio 2013では、ファイルが開けませんとなり、途中で、終了してしまうのですが、mingwでは、ちゃんとファイルが開けて、プログラムが、最後まで動作するのですが、なぜでしょうか? 原因を詳しく教えてください。また、改善方法も教えてください。 プログラム #include <iostream> #include <fstream> #include <ctime> #include <cstdlib> #include <list> #include <string> using namespace std; int main() { srand((unsigned)time(NULL)); list<string> str; char sstr[255]; int count = 0; int i; ifstream in("ttest", ios::in | ios::binary); if (!in){ cout << "入力ファイルが開けません\n"; getchar(); return 1; } while (!in.eof()){ in.getline(sstr, 255); str.push_back(sstr); count++; } i = rand() % count ; list<string>::iterator p; p = str.begin(); for (int j = 2; j <= i; j++)p++; cout << *p; cout << endl; getchar(); return 0; }

  • RJMS
  • お礼率70% (58/82)

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

  • ベストアンサー
  • Wr5
  • ベストアンサー率53% (2177/4070)
回答No.1

>visual stdio 2013では、ファイルが開けませんとなり、途中で、終了してしまうのですが、 >mingwでは、ちゃんとファイルが開けて、プログラムが、最後まで動作するのですが、なぜでしょうか? こういう時の「お約束」ですが… 『カレントディレクトリ』って言葉は知っていますか? フルパスで指定していないので、カレントディレクトリからの相対パスになります。 その際にカレントディレクトリが何処なのか…と言うことを意識しないと、 「ファイルはあるはずなのにオープンに失敗する」ということになります。 オープンに失敗しているのであると思っているファイルは「カレントディレクトリから見ると」無いんですよ。 Visual Studioなら、プロジェクトの設定でカレントディレクトリ(作業ディレクトリとか書かれているかもしれない)を設定できます。

RJMS
質問者

お礼

できました!!!! ありがとうございました。 カレントディレクトリという言葉は知っていたのですが、それがどこで設定できるかもわからなかったので、ありがとうございました。

関連するQ&A

  • Sortプログラムについて2

    えっと、前回もSortのプログラムについて、質問させていただいたのですが、このプログラムでは、二つのファイルを使ってソートしてるのですが、一つのファイルだけを使って、それに上書きするためにはどうするればいいでしょうか? 下に、ソースを貼っておきます。 #include <iostream> #include <fstream> #include <list> #include <string> using namespace std; int main() { char Str[255]; list<string> str; int count = 0; ifstream in("ttest", ios::binary | ios::in); if (!in){ cout << "入力ファイルが読み込めない" << endl; exit(1); } ofstream out("out", ios::binary | ios::out); if (!out){ cout << "出力ファイルが読み込めない" << endl; exit(1); } while (!in.eof()){ //!!!! in.getline(Str,255); str.push_back(Str); count++; } str.sort(); list<string>::iterator p; p = str.begin(); while(p!=str.end()){ out << *p << endl; p++; } in.close(); out.close(); getchar(); return 0; } よろしくお願いします。

  • Sortプログラムについて

    自分で作成したプログラムなのですが、ソートしたあと、出力ファイルに書き込みたいのですが、書き込めません。 どこが、悪いのかわからないので教えてください。 ところどころに、出力がありますが、それはトレースしたやつなので、それはほっといてくださって構いません。 下にプログラムを載せます。 よろしくお願いします。 #include <iostream> #include <fstream> #include <list> #include <string> using namespace std; int main() { char Str[255]; list<string> str; ifstream in("ttest", ios::binary | ios::in); if (!in){ cout << "入力ファイルが読み込めない" << endl; exit(1); } ofstream out("out", ios::binary | ios::out); if (!out){ cout << "出力ファイルが読み込めない" << endl; exit(1); } while (!in.eof()){ //!!!! in.getline(Str,255); str.push_back(Str); } str.sort(); list<string>::iterator p; p = str.begin(); while (!in.eof()){ cout << *p; out << *p++; } in.close(); out.close(); getchar(); return 0; }

  • ポインタ スペースを数えるプログラム

    入力した文章のスペースを数えるプログラムを作ってみました. ポインタをまだしっかり理解していないのですが,ポインタを使用 する場合,以下のようなプログラムで正しいですか? (オーバーフローなどについては対処していません.) #include<stdio.h> int main(void) { char str[80],*p; int i,count=0; gets(str); p=str; for(i=0;i<80;i++) { if(p[i]==' ') { count++; } } printf("%d",count); return 0; }

  • プログラムが~~~!!

    こんにちは。今、プログラム書いてるんですけど目的としては、 1、テキストファイルから文字列を読み込む。(大体数万文字) 2、それを100個ずつに区切る。 3、その百個ずつを二文字ずつ読んでいって、それがgcという文字列ならばその 百個の中での割合を示す。 4、さらに次の百個を・・・・ みたいなプログラムを書いてるんですけど一応下のような形までこぎつけましたが もう、お手上げです。 どなたか、助けてください。 #include<iostream.h> #include<stdio.h> #include<string.h> int main() { char pch[3]; int count=0; FILE *fin; fin=fopen('C:\ahowaki.dat','r'); fscanf(fin,'%s',&pch); cout<<"入力\n"; while(pch){ cin.read(pch,2); if((strcmp(pch,"gc"))==0) count++; if(count>=0 && count<=25) cout<<"Under25%\n"; if(count>=26&& count<=50) cout<<"Under50\n"; if(count>=51&& count<=75) cout<<"Under75%\n"; if(count>=76&& count<=100) cout<<"Under99%\n"; else cout<<"Over100%\n"; } return 0; fclose(fin); }

  • strstr()を使ったプログラムについて

    上のプログラムでは正しい結果がでて、下のプログラムでは正しい結果がでない理由を教えてください。 <上のプログラム> #include<stdio.h> #include<string.h> main() { char *str = "Apple,Lemmon,Apple,Orange,Grape,Apple,Lemmon"; int i = 0;     while((str = strstr(str,"Apple")) != NULL){ str++; i++; }     printf("文字列の中にAppleは%d個含まれます。",i); return 0; } <下のプログラム> #include<stdio.h> #include<string.h> main() { char *str = "Apple,Lemmon,Apple,Orange,Grape,Apple,Lemmon"; int i = 0;     while(strstr(str,"Apple") != NULL){      str++; i++; } printf("文字列の中にAppleは%d個含まれます。",i); return 0; } 実行環境はBorland C++、上のプログラムでは正しく3と表示されますが、 下のプログラムでは33と表示されてしまいます。

  • 結果が不安定なプログラム

    配列に入れられた文字列を、別の配列に逆にして入れ、表示するというプログラムを作っています。 #include<stdio.h> #include<string.h> #include<stdlib.h> void main() {   char str1[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZ", str2[] = "";   int i = 0, len = strlen(str1);   char *p1 = str1 + len - 1, *p2 = str2;   while(*(p1 - i) != str1[0] - 1) *(p2 + i) = *(p1 - i++);   printf("str1 = %s\n",p1 = str1);   printf("str2 = %s\n",p2); } 実行結果: str1 = ABCDEFGHIJKLMNOPQRSTUVWXYZ str2 = ZYXWVUTSRQPONMLKJIHGFEDCBA と出るのですが、この文字列を例えば"TANGOHYOJI"とかに変えてみると、実行は出来るんですがprintfの部分が表示されません。 また表示できても、文字が違う文字になって表示されたりします。 あと、この場合に使われている<stdlib.h>はどういった役割を果たしているのでしょうか?これがないとこのプログラムは動かなかったのですが・・。 どうかよろしくお願いします。

  • プログラムの動作

    独学でプログラムの勉強をしようと、サイトや本を見ながら勉強しているのですが、ポインタの使用がいまいち理解できません。 下にあるプログラムの動作の流れを順を追って教えていただきたいです。 (細かくいいますと、ポインタの動きと関数の動きの点を重点的に教えていただきたいです。(特にfor文内) 『以下プログラム』 1: #include<stdio.h> 2: 3: void h(char **p){ 4:     (*p)++; 5: } 6: 7: int main(void){ 8: 9: int i; 10: char str[]="abcdefghij"; 11: char *p_str; 12: 13: p_str=str; 14: for(i=0;i<(sizeof(str)/sizeof(str[0]));i++){ 15: printf("[%s]\n",p_str); 16: h(&p_str); 17: } 18: 19: return(0); 20: } 出力結果 [abcdefghij] [bcdefghij] [cdefghij] [defghij] [efghij] [fghij] [ghij] [hij] [ij] [j] []

  • 実行できません

    #include<iostream> #include<cstring> using namespace std; void reverse(char *str,int count=0); int main(){ char *s1="this is a test."; reverse(s1); cout<<s1; return 0; } void reverse(char *str,int count){ int i,j; char temp; if(!count)count=strlen(str)-1; for(i=0,j=count;i<j;i++,j--){ temp=str[i]; str[i]=str[j]; str[j]=temp; } } これはあるサンプルプログラムなのですが、visual studio 2008でコンパイルしたらこのように実行ファイルはできるのですが実行できません。 C:\Program Files\Microsoft Visual Studio 9.0\VC\INCLUDE\xlocale(342) : warning C 4530: C++ 例外処理を使っていますが、アンワインド セマンティクスは有効にはなりま せん。/EHsc を指定してください。 Microsoft (R) Incremental Linker Version 9.00.30729.01 Copyright (C) Microsoft Corporation. All rights reserved. /out:samplem.exe samplem.obj どうしてでしょうか?よろしくお願いします。

  • 2次元配列

    課題で、氏名をローマ字で入力し、2次元配列に格納するプログラムを作成するというのがでました。条件として、氏名の長さは10文字以下、最大件数は10件。1エントリ入力ごとに累計件数を表示し、10件目の入力が完了するか、氏名の一文字目に'0'が入力されたら入力を終了しデータを表示する。11文字以上入力されたら、先頭から10文字までを有効とし、11文字目以降を無視する。 改行のみの入力の場合、エラーメッセージを表示し、再入力させる。 初心者の私には、データの表示と、条件の処理の仕方がわかりません。 下記プログラムを上記の条件を満たすようにするには、どこを直したらよいか教えてください。 お願いします。 #include <stdio.h> #include <string.h> #define BUFFERSIZE 1024 main() { char str[10][BUFFERSIZE]; char c; int count = 0; int i; int j; int l[10]; /*氏名の入力*/ for (i = 0; i < 10; i++) { printf("氏名人力 : "); while ( (c = getchar()) != '\n' ) { if( count < BUFFERSIZE - 1 ){ str[i][count++] = c; } } str[i][count] = '\0'; printf("累計 : %d \n", i+1); } for (i = 0; i < 10; i++) { for (j = 0; j < 10; j++) { printf("%c",str[i][j]); } putchar('\n'); } return 0; }

  • 配列の練習問題

    #include<iostream> using namespace std; //count関数の宣言 int count(char str[], char ch); int main() { char str[100]; char ch; cout << "文字列を入力して下さい。\n"; cin >> str; cout << "文字列から探す文字を入力して下さい。\n"; cin >> ch; int c = count(str, ch); cout << str << "の中に" << ch << "は" << c << "個あります。\n"; return 0; } //count関数の定義 int count(char str[], char ch) { int i = 0; int c = 0; while (str[i]) { if (str[i] == ch) c++; i++; } return c; } こんにちは。 この問題の解答のプログラムの意味がイマイチ解らないので良かったら教えて下さい。 確認がてらに質問します。 よろしくお願いします。

専門家に質問してみよう