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

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

ただいまの
回答率

90.99%

  • C++

    2939questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Visual Studio

    1497questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

  • DirectX

    61questions

    DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。

CSVファイルを途中から読み込ませたい

解決済

回答 3

投稿

  • 評価
  • クリップ 1
  • VIEW 570

toshiya1213

score 7

前提・実現したいこと

CSVファイルに書いた情報を一行ずつ読み込むことはできているのですが、それを一行読んだ後一度その関数の内の処理を抜けて、さらにもう一度その関数に入ったときに読み込んだ途中からCSVファイルを読み込めるようにしたいのですがどうやるかわかりません、、、ご教授お願いいたします。

該当のソースコード

include"Csv.h"

include<stdio.h>

include<stdint.h>

include<iostream>

include<fstream>

include<string>

using namespace std;

HRESULT CCsv::FileOpenList(char* filename)
{
string str;
char* name = new char[256];
//ファイルを読み込む
ifstream fp(filename);
//ファイルを開く
if (fp.fail()) { MessageBox(NULL,"が開けません", filename,MB_OK); }
//一行ずつ読み込む
while (getline(fp, str)) 

//読んだ行をコピーする
strcpy(name, str.c_str()); 
break;
}    
}

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

言語はC++です。visual studio2015使用。DirectX9。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • MasahikoHirata

    2017/09/24 18:40

    タグに”DirectX"が有りますが、本質問には無関係に思えます。飽くまでC++の範囲の質問では?

    キャンセル

  • toshiya1213

    2017/09/25 10:58

    確かに無関係でした。分け隔てなく書いてしまいました。

    キャンセル

回答 3

checkベストアンサー

+3

こんにちは。

前に読み込んだところからまた読み出しをはじめるには、その時点のファイルポインターを
保存して次にまたそれを使う、とのような流れになるかと思います。
FileOpenList()の流れをなるべくそのままに、簡単に書いてみましたので参考になさってください。

fp.tellg() で読み出したファイルの位置を取得してFileOpenList2()関数の呼び出し元に返し、
次にまたFileOpenList2()が呼ばれたときにはfp.seekg() で、その位置へ移動します。
Visual Studio 2015で実行を確認済みです。

ifstream::pos_type FileOpenList2(char* filename, int seek)
{
    string str;
    //ファイルを開く
    ifstream fp(filename);

    if (fp.fail()) {
        cerr << "Error: " << strerror(errno);
        MessageBox(NULL, "が開けません", filename, MB_OK);
        return -1;
    }

    char* name = new char[256];
    fp.seekg(seek, ios_base::beg);

    //ファイルを読み込む
    //一行ずつ読み込む
    while (getline(fp, str))
    {
        //読んだ行をコピーする
        strcpy(name, str.c_str());
        printf(">>>%s\n", name);

        break;
    }

    // 読み出し後の位置を取得
    ifstream::pos_type pos = fp.tellg();
    delete[] name;
    return pos;
}

int main(void) {

    char filename[] = "file.txt";
    ifstream::pos_type pos = 0;

    while (pos != (ifstream::pos_type)-1) {
        pos = FileOpenList2(filename, pos);
    }

    return 0;
}

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/24 18:04

    先に回答された方がいらっしゃるので、補足です。私の回答は「もう一度、関数に入ったときに前の場所から読むにはどうすれば?」と言う観点からの回答です。アプリケーション全体の設計としては、本当に途中から読まなければいけないのか?1回で処理できないか?」と言うところから考え直して、このようなコードにならないようにすることを検討してみるのも良いと思います。

    キャンセル

  • 2017/09/25 10:42

    求めていた回答をありがとうございます!やはり一度で処理するべきだと思いましたが、気になってしまい質問させて頂きました。わざわざ確認もしてもらいとても助かりました。アプリケーション全体の設計がこのようなことにならないよう気を付けたいと思います。

    キャンセル

  • 2017/09/25 11:17

    参考になれて幸いです。今回のプログラムには該当しないと思いますが、巨大なファイルを扱っていて、ある位置のレコードを読んで重い処理をし、後で続行するような場合、ファイルの場所を覚えておくようなケースが皆無でもないので、テクニック的に可能だと言うことを知っておくのは悪いことではないと思います。

    キャンセル

+1

>一度その関数の内の処理を抜けて、さらにもう一度その関数に入ったときに読み込んだ途中からCSVファイルを読み込めるようにしたい

とありますが、「抜けて何をしたいのか」が分かれば回答しやすいです。
普通の方法では、ループの途中で抜けてしまって再度関数に戻ってきたら途中からというのは難しいです。

ループからは抜けずに、ループの途中で何かしらの処理が完了するまで処理を一旦止めて、何かしらユーザーが操作したらループを再開する方法では実現できないでしょうか?

ループをどこまで処理をしていたか記憶をしておきたいのであれば、DBを使うなりのアプローチが必要になると思います。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/25 10:45

    曖昧な質問をしてしまいすいませんでした。やはりループを抜けずにやるべきですよね、、DBについて勉強したいと思います。ありがとうございました!!

    キャンセル

+1

なぜ、ファイル上でこのようなことをするのか
詳細が不明なので的をはずれた内容かもしれませんが
ファイル上で何かするよりは
一度、CSVファイルの内容のすべてを読み込んで
ArrayなりListなりに行単位に格納して
処理するようにすれば
良いのではないでしょうか?

途中に何か処理をしたいということですが
この方法ならCSVの内容変更があった場合でも
簡単に変更ができるし
最後に、格納しているArrayやListから
現在のCSVファイルに簡単に上書き保存でも
別ファイルにでも保存が簡単にできますし。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/09/25 10:34

    自作したリストに格納したいと思っていてreturnで文字列を返してあげて次のリストでまたこの処理に入りreturnで返すことを繰り返したいと思って質問しました。やはりその方が結果的に良いですよね、、、

    キャンセル

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

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

関連した質問

  • 受付中

    C++ エラーがたくさんでて困っています。。デバッグを助けてください。。

    以下のコードを書いたのですが思い通りに動きません。。 デバッグを教えてほしいです。。 #include <iostream> #include <string.h> usin

  • 解決済

    C言語 式の構文エラー 内容について

    複数の単語からなる文を入力し,各単語の先頭文字を大文字に変えて表示させる というプログラムを作っているのですが、コンパイル時に ------ Borland C++ 5.5.1 f

  • 解決済

    C言語 fopen パス指定

    初歩的な質問になってしまいます。 ファイルのパスを指定してfopenをしたいのですが、うまくいかなかったので質問させていただきます。 OSはLinuxです。 まず buf[]="

  • 解決済

    gccによる文字コード変換

    今回、C言語でファイルを読み込みそのファイルの文字コードをShift-JISに変換するプログラムを作成したのですが,変換後の文字が以下のソースコードを使用すると表示されません.どこ

  • 受付中

    C言語 文字列の入力についての質問です

    C言語の文字列入力について質問です。 例えば、 homy tomi sami tani sai tom rari rare tara 等の不定個の名前が2行にわたってあるとし

  • 解決済

    C言語でテキストファイルの行削除

    C言語でテキストファイルの指定した行の削除を行いたいです。 sample.txtが >giaaaaaaaa hoge fuga piyo となっているときに、>giの行を削除し

  • 解決済

    C++ :  delete演算子のエラー

    リスト###前提・実現したいこと 下記エラーが発生してしまい、解決できません。 基本的なことで申し訳ないですが、教えてください。 発生している問題・エラーメッセージ

  • 解決済

    参照型?ポインタ?

    関数の引数が書きなのですが、 通常のポインタや参照型と何が違うのでしょうか? , char*& strResult,

同じタグがついた質問を見る

  • C++

    2939questions

    C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

  • Visual Studio

    1497questions

    Microsoft Visual StudioはMicrosoftによる統合開発環境(IDE)です。多種多様なプログラミング言語に対応しています。

  • DirectX

    61questions

    DirectX(ダイレクトエックス)は、 マイクロソフトが開発したゲーム・マルチメディア処理用のAPIの集合です。