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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Studio

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

C++

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

DirectX

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

Q&A

解決済

3回答

2598閲覧

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

toshiya1213

総合スコア11

Visual Studio

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

C++

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

DirectX

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

0グッド

1クリップ

投稿2017/09/24 07:41

###前提・実現したいこと
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。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

MasahikoHirata

2017/09/24 09:40

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

2017/09/25 01:58

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

回答3

0

ベストアンサー

こんにちは。

前に読み込んだところからまた読み出しをはじめるには、その時点のファイルポインターを
保存して次にまたそれを使う、とのような流れになるかと思います。
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 08:57

dodox86

総合スコア9183

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

dodox86

2017/09/24 09:04

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

2017/09/25 01:42

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

2017/09/25 02:17

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

0

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

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

投稿2017/09/25 01:12

cutedog

総合スコア177

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toshiya1213

2017/09/25 01:34

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

0

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

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

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

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

投稿2017/09/24 08:46

mtdsnsk

総合スコア789

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

toshiya1213

2017/09/25 01:45

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問