ISLe さんが書きました:
Kaien さんが書きました:しかしながら、それでもresizeをする事で発生する別の問題のについては、言及すべきだったかもしれません。その件について、言葉足らずで申し訳ありませんでした。
この時点でkをカウントするループがファイルから読み込んだ行数を越えてresizeで指定した分まで空回りするということに気付いていたのか正直に教えていただけないでしょうか。
kをカウントするループがresizeによって空回りしてしまうことには、気づいていました。
DOG さんが書きました:
原因はいったい何なのでしょうか?
今回のケースに関しては、原因を聞く質問でしたのでアクセス領域外を触っている事が一目で分かる所を指摘してしまった事になります。
それが早計であった点は弁明のしようがありません。
実際"最初の回答"では、for文しか指摘していませんし、resize推奨していますし。
ISLe さんが書きました:
気付いていたか気付いていなかったに関わらず、質問に書かれたコードの『仕様』が変わることについて、また、そのような回答をすることについて、どうお考えなのでしょう。
質問に書かれたコードが"どうやってもこれは動作しない"等の理由から仕様を変更する必要がありそうな場合、及び質問者がそれを望んでいる場合は仕様変更も止む無しだと思いますが、基本的には、回答者は質問者の仕様を通すべきではないかと思っています。
そうでないと回答者の意思の押し付けになってしまいますから。
今回の件で、確認作業を怠ったこと、中途半端な回答をしてしまったことを反省しています。
質問者のDOG様、ISLe様を始め多くの方にご迷惑をおかけしてしまい、申し訳ありませんでした。
DOG さんが書きました:
csvファイルの数値をvectorの2次元配列に格納するプログラム書いている
最後にresizeを使わない方法で、「,」を含めたCSVファイル読み込みのコードは以下みたいな感じでしょうか。
まあ、こういうやつが書いたコードですので、DOG様の求めるコードとは程遠いとは思いますが、私なりにDOG様の最初の文だけを見て、組みたいのであろうなと思えるものを書き出してみました。
実用的な意味で言えば、かずま様のコードの方が後々有効だと思いますので、あくまでこんな偏屈な方法もあるよ的な目で見て頂ければと。
コード:
#include <iostream>
#include <fstream>
#include <vector>
#include <string>
int main(int args, char* argv[])
{
using namespace std;
ifstream ifs;
ifs.open("sample.csv"); // 中身はDOG様と同じ物を使っています
// ifs.open() == true : ファイルオープン成功
// ifs.open() == false : ファイルオープン失敗,エラー処理へ
if (!ifs)
{
cout << "ファイルオープン失敗" << endl;
return -1;
}
vector<vector<string>> vss;
// 読み込み
string line;
while (getline(ifs, line)) // getline 失敗時 ループ終了
{
static size_t num = 0;
num = vss.size(); // 1ファイルのみ1回だけ読み込むのならば、push_back後に++numでも可
vss.push_back(vector<string>());
vss[num].push_back(line);
}
ifs.close(); // デストラクタで閉じるけれど明示する派の人間なので。
// 表示
for (size_t i = 0; i < vss.size(); ++i)
{
for (size_t j = 0; j < vss[i].size(); ++j)
{
cout << vss[i][j] << endl;
}
}
return 0;
}
// 本当にすみません。プログラムの一部が間違ってました。
実行結果
コード:
2,3,4
6,4,1,9,0,5
7,2,5,6
長文失礼しました。