質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.10%

C++でテキストファイルを読み込んで、数値を振り分けたい

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 2,352

do_Shiro_to

score 15

前提・実現したいこと

ど素人の質問ですみません。
”sample.text"
5
9
-19
-4
4
89
-1
このようなテキストファイルを読み込んで、それぞれの数値を正数・負数に振り分け、正数の数・合計値、負数の数・合計数を表示するプログラムを作りたいです。

理想の結果としては、
正数:4
正合計:107
負数:3
負合計:-24

発生している問題・エラーメッセージ

ファイルの読み込みができないし、できたとしてもどうやって数列を分割して振り分けて格納すればいいのかわかりません。

該当のソースコード

#include <iostream>
#include <fstream>
#include <string>
using namespace std;

int main()
{

    ifstream file;
    string num;

    file.open("Sample.txt");

    if (file.fail())
    {
        cout << "fail" << endl;
        return -1;
    }

    string str;
    while (getline(file, str)) {
        file >> str;
        cout << str << endl;
    }


    file.close();
    return 0;
}

//実行結果:fail

試したこと

ネット上にあるいろんなサンプルコードを組み合わせてなんとかエラー表示をしない程度にはまとめれたんですが、ファイルが開けません。
ifstream file(“Sample.txt”);
みたいなコードも試してみたんですが、そうするとSampleが定義されてません、といわれそもそも実行できません。

補足情報(FW/ツールのバージョンなど)

だれか助けてください。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 3

checkベストアンサー

+1

ファイルがオープンできないのはファイルの置き場所が問題であることが多い
ので、まずそれを確認してください。

Windows の Visual Studio のような IDE(統合開発環境) を使っている場合
ソースファイルの場所、実行ファイルの場所、プロジェクトの場所が異なります。
sample.text の置き場所を変更するか、あるいは、"sample.text" を
"c:/user/hoge/.../sample.text" などのように絶対パスにしてみるなどを
試してみてください。

追記

Linux では、ファイル名の大文字と小文字は区別されます。
sample.text と Sample.text は異なるファイルです。
ファイルの拡張子が .text か、.txt かにも注意してください。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/30 10:09

    Visual Studio を使っているのですが、ファイルってどうやってリソースに追加するんでしょうか…??Open fileでtxtファイルをcppファイルのとなりに置いたんですけど、明らかに間違ってますよね…

    キャンセル

  • 2019/06/30 10:59

    F5/ctrl-F5で実行してるなら、ファイルはプロジェクト・ディレクトリに置け。

    キャンセル

  • 2019/06/30 11:41

    普通.vcxprojファイルと同じdirectoryが実行時のカレントディレクトリ。

    キャンセル

  • 2019/06/30 14:07

    プログラム始めてまだ一週間の本当にど素人でして…
    ディレクトリっていうのはどれのことでしょうか??検索してもファイルのようなものだということ以外よくわからず…
    お手数ですが、もう少しわかりやすく解説してくださると助かります。

    キャンセル

+1

#include <iostream>
#include <fstream>
#include <string>

int main() {
    using namespace std;

    ifstream file("sample.txt");

    if ( !file.is_open() ) {
        cout << "fail" << endl;
        return -1;
    }

    int positive_count = 0;
    int negative_count = 0;

    int positive_sum = 0;
    int negative_sum = 0;


    int num;
    while ( file >> num ) {
        if ( num > 0 ) {
          ++positive_count;
          positive_sum += num;
        } else if ( num < 0 ) {
          ++negative_count;
          negative_sum += num;
        }
    }

    cout << "positive: count = " << positive_count << " sum = " << positive_sum << endl;
    cout << "negative: count = " << negative_count << " sum = " << negative_sum << endl;
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/06/30 14:12

    なんとなく考え方は理解できました!
    ありがとうございます!!

    キャンセル

+1

フォルダなら分かりますか?
ディレクトリはフォルダのことだと思ってください。
ファイルはフォルダの中にあります。
フォルダは別のフォルダの中にあります。
これを階層ファイルシステムといいます。
Windows なら、一番上が Cドライブで、これを C: で表します。
"C:/Users/Shiro/source/repos/Project3/.../sample.txt"
のようにフォルダを並べて書くのを絶対パス名といいます。
"sample.txt" や "data/tmp/sample.txt" や "../../data/sample.txt"
のようなものを相対パス名といい、カレントディレクトリ(現在注目している
フォルダ)の中のファイル、下のファイル、上のファイルを参照します。
Visua Studio ではなく、エクスプローラーを使って、
ファイルの削除や移動やコピーができますか?

追記

すみません。
コメントを書いたつもりが回答になってしまいました。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/07/02 15:40

    わかりやすく解説してくれてありがとうございます!!

    キャンセル

  • 2019/07/02 16:33

    そのようにして問題を解決したかを書いてください。
    sample.text の置き場所を変えたのか。
    プログラム中に絶対パスを書いたのか。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.10%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる