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

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

新規登録して質問してみよう
ただいま回答率
85.49%
標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

C++

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

Q&A

解決済

1回答

588閲覧

C++で表形式の入力を受け取りたい

hasu_non_sucre

総合スコア9

標準入力

標準入力(stdin)は、プログラムが標準的に用いるデータ入力元。リダイレクトしない限り、プログラムを起動した端末のキーボードが標準入力になります。UNIX系OSやC言語に実装されて普及した概念ですが、他のOSや言語も含めた総称としても使われます。

C++

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

0グッド

0クリップ

投稿2022/05/16 15:50

実現したいこと

C++で表形式の入力を受け取りたい

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

aaa 1
bbb 2
ccc 3

のような半角スペースで区切られた文字列と数字で一行が構成される表を入力として受け取りたいです。
なお、表の行数に指定はなく最終行の最後には改行コード(<LF>)があります。

該当のソースコード

c++

1#include <bits/stdc++.h> 2using namespace std; 3 4int main() { 5 string s; 6 double n; 7 8 while(cin >> s >> n) { 9 } 10} 11

試したこと

上記のようなコードを入力として書いたのですがよくわからなかったので質問させていただきました。
的を得ない質問でしたらすみません。

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

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

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

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

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

majiponi

2022/05/16 22:14

受け取って何をしたいか、によって処方されるアドバイスは変わってきます。そのままエコーするのか、数値を2倍にするのか、行と列を入れ替えるのか、…など、もう少し具体的に記載してもらえますか?
thkana

2022/05/16 22:25

なにがわからなかったのかわかりません... 「知りたいこと」を教えてください。 > 最終行の最後には改行コード(<LF>)があります 途中の行の最後には改行コードがないのですか?
fana

2022/05/17 01:54

行数不明であれば,入力の終了方法を何かしら決める必要があるのでは?
fana

2022/05/18 01:23

何だか入力に関する文言が曖昧だなぁ(そもそも入力例を改行コード位置を明記する形で示さない意味がわからんね) まず「最終行」って何すか? っていう説明よりも前に > 最終行の末尾には必ず改行コードが付与されることを前提として良い。 とか書かれていて,その後に > 最終行 (最終レコードの改行コードの後) をのぞいて、空行は存在しない っていう記述がある. この2つから,要は,入力の終わりには必ず「改行コードだけしかない行(空行)が存在する」(且つ,それ以外にはそのような空行は無い)という話であろう. (でも入力例にはその「空行」が存在して無いっていう…) であれば,入力の終了方法は「空行が入力されたら」でおk.
guest

回答1

0

ベストアンサー

(「質問への追記・修正の依頼」のところで述べましたが)

大元の問題文を見た感じ,「空行が入力の終了位置を表すために用いられる」という仕様であろうと思われます.
そうであれば,あなたがやるべきこととは,単に「空行が来るまでひたすら読み続ける」ということになるでしょう.

C++

1struct Record 2{ 3 std::string TimeStamp; //時刻 4 double Mileage; //走行距離 5 6 Record( const std::string &ts, double m ) : TimeStamp(ts), Mileage(m) {} 7}; 8 9int main() 10{ 11 //入力処理 12 std::list< Record > InputData; 13 { 14 //1行ずつ読む. 15 //(この話だと,getlineの結果をwhileのループ条件にする必要性も無いが) 16 std::string line; 17 while( std::getline( std::cin, line ) ) 18 { 19 //空行だったら終わり 20 if( line.empty() )break; 21 //スペースの位置で2つのデータに分ける 22 auto SpaceIndex = line.find( ' ' ); 23 InputData.emplace_back( line.substr( 0, SpaceIndex ), std::stod( line.substr( SpaceIndex+1 ) ) ); 24 } 25 } 26 27 //入力結果確認 28 for( const auto &rec : InputData ) 29 { 30 std::cout << rec.TimeStamp << " , " << rec.Mileage << std::endl; 31 } 32 return 0; 33}

投稿2022/05/18 01:50

fana

総合スコア11645

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

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

hasu_non_sucre

2022/05/18 22:56

空行を待てばよかったんですね、、 問題文への理解が浅かったです。 とても助かりました!ありがとうございます!!
fana

2022/05/19 00:55

もちろん,大前提として,「私の問題文の理解が正しければ…」ですけどね. (何でこんな無意味に読み難い問題文書くんだろう?)
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問