たかが標準入力から1行読み込む処理、されどハマりました。
固定バッファは溢れるたりして厄介なので、デリミタまでをstringクラスに代入してくれる関数を使おうと思いました。C++にはstd::getlineという、まさにその動きをする関数があるのですが、なぜかEnterを二回押さないと動かないという変な関数で使えません。仕方なく自作することに。
単純にistream::get(char *, int, int)でバッファ長かデリミタまで取ってstringに連結し、デリミタはistream::ignore(1)で消し去ればかんたーん、などと思ったのですよ。しかしgetの動きがイカレてて、何も入力せずにEnterを押すとエラーになります。すると後のistream::peek()が全部EOFを返しますが、ファイル末端というわけではないのでistream::eof()は偽を返し、無限ループに陥ります。な、なんだってー!?
結局istream::get(char *, int, int)にあたる部分もistream::get()を使って自作しなければならず、1行取ってくるだけのプログラムがかなり肥大化しました。これじゃ何のためのC++だかわかりませんよ。お願いだから開発系くらいちゃんと作ってくれよ、M$さん頼むよー(´Д`;)
作ったコードはこんな感じです。あまり洗練されたコードではありませんが、読みやすさ優先主義ってことで許して。
//理想(g++ だとこちらで動く、ていうかそれが当然)
#include <iostream>
#include <string>
using namespace std;
int main(int argc, char *argv[])
{
string str;
while (!cin.eof()){
//1行取得
std::getline(cin, str, '\n');
//1行出力
cout << "out: " << str << endl;
}
return 0;
}
//現実(こちらも当然だがg++ で動く)
#include <iostream>
#include <string>
using namespace std;
istream &getBlock(istream &s_in, char *pbuf, int size, char delim);
istream &getLine(istream &s_in, string &str_buf, char delim);
int main(int argc, char *argv[])
{
string str;
while (!cin.eof()){
//1行取得
getLine(cin, str, '\n');
//1行出力
cout << "out: " << str << endl;
}
return 0;
}
//終端、区切り文字またはバッファサイズ - 1まで入力を取り出す
istream &getBlock(istream &s_in, char *pbuf, int size, char delim)
{
int ch, pt;
for (pt = 0; !s_in.eof(); pt++) {
ch = s_in.get();
//区切り文字検出
if (ch == delim || pt >= size - 1) {
s_in.putback((char)ch);
break;
}
pbuf[pt] = (char)ch;
}
//nul文字付加
pbuf[pt] = '\0';
return s_in;
}
//改行までstringクラス変数に入力を取り出す
istream &getLine(istream &s_in, string &str_buf, char delim)
{
char buf[BUFSIZE];
//バッファ初期化
str_buf = "";
while (!s_in.eof()) {
//バッファの限界か、区切り文字まで読み込む
getBlock(s_in, (char *)buf, sizeof(buf), delim);
//連結
str_buf += buf;
//区切り文字にて読み込みが止まった場合
if (s_in.peek() == delim) {
s_in.ignore(1);
break;
}
}
return s_in;
}
< | 2003 | > | ||||
<< | < | 12 | > | >> | ||
日 | 月 | 火 | 水 | 木 | 金 | 土 |
- | 1 | 2 | 3 | 4 | 5 | 6 |
7 | 8 | 9 | 10 | 11 | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | 30 | 31 | - | - | - |
合計:
本日:
管理者: Katsuhiro Suzuki(katsuhiro( a t )katsuster.net)
This is Simple Diary 1.0
Copyright(C) Katsuhiro Suzuki 2006-2023.
Powered by PHP 8.2.15.
using GD bundled (2.1.0 compatible)(png support.)