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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C++

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

Q&A

解決済

2回答

1344閲覧

C++ 52行のstringからユーザーが選んだ行のstringの抜き出しかたについて

amareno

総合スコア20

C++

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

0グッド

0クリップ

投稿2018/11/14 09:14

編集2018/11/14 23:04

実現したいこと

52行のトランプカードからユーザーがinputした行のトランプカードを抜き出し表示するプログラムを作っています。

  Ace Spade
Ace Heart
Ace Diamond
Ace Club
2 Spade
2 Heart
2 Diamond
2 Club
3 Spade
3 Heart
3 Diamond
3 Club
4 Spade
4 Heart
4 Diamond
4 Club
5 Spade
5 Heart
5 Diamond
5 Club
6 Spade
6 Heart
6 Diamond
6 Club
7 Spade
7 Heart
7 Diamond
7 Club
8 Spade
8 Heart
8 Diamond
8 Club
9 Spade
9 Heart
9 Diamond
9 Club
10 Spade
10 Heart
10 Diamond
10 Club
Jack Spade
Jack Heart
Jack Diamond
Jack Club
Queen Spade
Queen Heart
Queen Diamond
Queen Club
King Spade
King Heart
King Diamond
King Club

例えば、ユーザーが1と入力したら上から一番目の
Ace Spade
が表示され、ユーザーが10と入力したら上から数えて10番目の
3 Heart
が表示されます。

ユーザーが1と入力したら
Ace Spade
と表示されるんですが、

ユーザーが10と入力しても、1以外の数字を入力しても
Ace Spade
と表示されます

下記のコードのどこを変更すれば良いでしょうか?

該当のソースコード

C++

1#include <string> 2#include <stdexcept> 3#include <iostream> 4#include <iomanip> 5#include <fstream> 6#include <limits> 7 8using namespace std; 9 10class Card { 11public: 12 enum class Suit { Spade, Heart, Diamond, Club}; 13private: 14 int number; 15 Suit suit; 16public: 17 Card (int n = 0, Suit s = Suit(-1)) : number(n), suit(s) {} 18 int getNumber() const { 19 if ( number < 1 || number > 13 ) throw range_error("bad Number"); 20 return number; 21 } 22 Suit getSuit() const { 23 if ( int(suit) < 0 || int(suit) > 3 ) throw range_error("bad Suit"); 24 return suit; 25 } 26 string description() const; 27}; 28 29string to_string(const Card::Suit& s) { 30 switch ( s ) { 31 case Card::Suit::Spade : return "Spade \n"; 32 case Card::Suit::Heart : return "Heart \n"; 33 case Card::Suit::Diamond : return "Diamond\n"; 34 case Card::Suit::Club : return "Club \n"; 35 } 36 return string(); 37} 38 39string Card::description() const { 40 static const char* nums[] = { " Ace", " 2", " 3", " 4", " 5", 41 " 6", " 7", " 8", " 9", " 10", 42 " Jack", "Queen", " King" }; 43 return string(nums[getNumber()-1]) + " " + to_string(getSuit()); 44} 45 46const int LINE = 52; 47 48int main() { 49 char buffer[LINE]; 50 51 fstream myFile; 52 myFile.open("lab.txt"); 53 54 Card deck[13][4]; 55 for ( int i = 0; i < 13; ++i ) { 56 for ( int j = 0; j < 4; ++j ) { 57 deck[i][j] = Card(i+1,Card::Suit(j)); 58 } 59 } 60 61 for ( auto& row : deck ) { 62 for ( auto& card : row ) { 63 cout << setw(16) << card.description(); 64 myFile << setw(16) << card.description(); 65 } 66 } 67 68 myFile.close(); 69 70 fstream myFile2; 71 myFile2.open("lab.txt"); 72 73 cout << "Enter a number: "; 74 int num; 75 cin >> num; 76 77 string str; 78 79 for(int i = 0; i < LINE - 1; i++) { 80 myFile2.clear(); 81 myFile2.seekg(0, ios::beg); 82 83 while(getline(myFile2, str)) { 84 myFile2 >> num; 85 } 86 } 87 cout << str; 88 89 myFile2.close(); 90 91 system("pwd"); 92 93 return 0; 94}

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

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

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

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

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

guest

回答2

0

seekg() 使うってそーゆーことなの?

C++

1#include <string> 2#include <stdexcept> 3#include <iostream> 4#include <iomanip> 5#include <fstream> 6#include <vector> 7 8using namespace std; 9 10class Card { 11public: 12 enum class Suit { Spade, Heart, Diamond, Club}; 13private: 14 int number; 15 Suit suit; 16public: 17 Card (int n = 0, Suit s = Suit(-1)) : number(n), suit(s) {} 18 int getNumber() const { 19 if ( number < 1 || number > 13 ) throw range_error("bad Number"); 20 return number; 21 } 22 Suit getSuit() const { 23 if ( int(suit) < 0 || int(suit) > 3 ) throw range_error("bad Suit"); 24 return suit; 25 } 26 string description() const; 27}; 28 29string to_string(const Card::Suit& s) { 30 switch ( s ) { 31 case Card::Suit::Spade : return "Spade \n"; 32 case Card::Suit::Heart : return "Heart \n"; 33 case Card::Suit::Diamond : return "Diamond\n"; 34 case Card::Suit::Club : return "Club \n"; 35 } 36 return string(); 37} 38 39string Card::description() const { 40 static const char* nums[] = { " Ace", " 2", " 3", " 4", " 5", 41 " 6", " 7", " 8", " 9", " 10", 42 " Jack", "Queen", " King" }; 43 return string(nums[getNumber()-1]) + " " + to_string(getSuit()); 44} 45 46int main() { 47 48 { 49 ofstream myFile("lab.txt"); 50 for ( int i = 0; i < 13; ++i ) { 51 for ( int j = 0; j < 4; ++j ) { 52 myFile << setw(16) << Card(i+1,Card::Suit(j)).description(); 53 } 54 } 55 } 56 57 ifstream file("lab.txt"); 58 59 std::vector<std::istream::pos_type> position; 60 std::string line; 61 for ( std::istream::pos_type pos = 0; getline(file, line); pos = file.tellg() ) { 62 position.push_back(pos); 63 } 64 65 cout << "Enter a number: "; 66 int num; 67 cin >> num; 68 69 file.clear(); 70 file.seekg(position[num-1]); 71 getline(file, line); 72 cout << position[num-1] << " [" << line << "]\n"; 73}

投稿2018/11/15 11:43

episteme

総合スコア16614

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

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

0

ベストアンサー

こんにちは。

myFile2 >> lineNum;

は1行読み取るのではなく、次の区切りまで読み取ります。
通常は空白や改行の最も最初に現れたところまでとなります。

std::getlineを使うと簡単ですよ。

投稿2018/11/14 09:56

Chironian

総合スコア23272

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

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

amareno

2018/11/14 18:48

回答ありがとうございます。ソースコードを編集しました。getline使ってみたのですが使い方がいまいち分からずエラーが出て困っています。どのように使えば良いのでしょうか? ちなみにこのプログラミングの問題文にseekgを使えと書いてあるのでseekgを使う前提でお願いします。
amareno

2018/11/14 23:11

コードを進展させました。エラーはなくなったんですがどの数字を入力しても一番上のAce Spadeしかアウトプットされず、どのようにすればそれを改善できるか分からず困っています。どう改善すれば良いか教えてもらえますでしょうか?
Chironian

2018/11/15 01:53

当初は読み飛ばしは成功していたと理解しています。何故、読み飛ばし処理を修正されたのでしょうか? 元に戻してみては如何でしょうか?
amareno

2018/11/15 04:53

ありがとうございます。もっと複雑なものだと勘違いしずっと試行錯誤しておりました。getline(myFile2, lineNum);と書いたら正常にアウトプットされました。スッキリしました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問