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

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

新規登録して質問してみよう
ただいま回答率
85.46%
ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

C++

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

Q&A

解決済

3回答

1512閲覧

C++ std::vectorを使用して文字列配列が作成できない

shiki_8700

総合スコア1

ファイル

ファイルとは、文字列に基づいた名前又はパスからアクセスすることができる、任意の情報のブロック又は情報を格納するためのリソースです。

C++

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

配列

配列は、各データの要素(値または変数)が連続的に並べられたデータ構造です。各配列は添え字(INDEX)で識別されています。

0グッド

0クリップ

投稿2021/10/20 14:16

編集2021/10/20 14:34

前提・実現したいこと

C++の初心者です。
txtファイルを一行ずつ読み込んで,一行それぞれ文字列配列に格納していくシステムが作りたいです。

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

txtファイルの一行だけ表示した後に

Line:1455
Expression:vector subscript out of range
For information on how your program can cause an assertion failure,see the Visual C++ documentation on asserts.

というエラーが表示されます。

該当のソースコード

C++

1#include <fstream> 2#include <iostream> 3#include <string> 4#include <vector> 5 6int main(int argc, char* argv[]) { 7 8 //コマンドライン引数のチェック 9 if (argc != 2) { 10 std::cerr << "引数の数が間違っています" << std::endl; 11 return 1; 12 } 13 14 //ファイル読み込み 15 std::ifstream file(argv[1], std::ios::in); 16 17 if (!file) { 18 std::cerr << "エラー:ファイルが開けません" << std::endl; 19 return 1; 20 } 21 22 std::vector<std::string> strList; //文字列配列 23 std::string line; 24 int i = 0; 25 while (std::getline(file, line)) { //getlineで一行ずつ読み込む 26 std::vector<std::string> strList = { line }; 27 std::cout << strList[i] << std::endl; 28 i++; 29 } 30 31 return 0; 32}

試したこと

std::vectorについて調べてみて,std::vector<int> data{3, 1, 4, 1, 5, 9, 2, 6, 5, 3};とやると値をそれぞれ参照することができましたが,一行を格納している「line」ではエラーが発生します。

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

開発環境 VisualStudio2019
言語   C++

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

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

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

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

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

jimbe

2021/10/20 14:31

c と c++ は関係ありません。 c++ のご質問であれば c のタグは外して頂けますか。
guest

回答3

0

ベストアンサー

while(std::getline(file,line))の中について, std::vector<std::string> strList = { line };を消してpush_back(___)を追加することで上手くいきますよ。___の中は自分で新たに定義したstring引数を入れてください。

投稿2021/10/20 16:30

wagashi_157

総合スコア51

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

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

shiki_8700

2021/10/20 17:55

strList.push_back(line);といれると解決しました。 ありがとうございました!
guest

0

同じ名前の変数(strList)を複数の箇所で宣言した場合、いちばん内側の変数しか見えません。

std::vector<std::string> strList = { line };で要素が1つのvectorを作っていますので、i >= 1strList[i]を参照すれば、もちろん範囲外です。

投稿2021/10/20 14:24

maisumakun

総合スコア145208

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

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

0

whileの中で、strListの末尾にlineを「追加する」コードを書きましょう。push_backメソッドで調べると幸せになれます。

投稿2021/10/20 14:23

majiponi

総合スコア1720

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問