C++相談室 part163

■ このスレッドは過去ログ倉庫に格納されています
2022/12/30(金) 23:16:31.37ID:DPUEZfMS0
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を3行貼り付けること

次スレは>>980が立てること
無理なら細かく安価指定

※前スレ
C++相談室 part162
https://mevius.5ch.net/test/read.cgi/tech/1667194175/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
247デフォルトの名無しさん (スププ Sd1f-qKKb)
垢版 |
2023/01/27(金) 13:51:05.37ID:mIJqx29Ld
マジレスすると C++ のテンプレで頑張るより
Nim 使った方が楽だし時間の節約になるよ
2023/01/27(金) 14:14:37.74ID:RdqQfVtbd
>>246
組み込みのチープな環境のプログラムを組んで見ればわかるよ
2023/01/27(金) 14:40:15.09ID:7yNCo9mI0
>>240
ヘボなんだね
2023/01/27(金) 14:50:32.81ID:MqPTrKVr0
コードサイズは確かに増えるだろうが、性能は本当に測ったんか?
2023/01/27(金) 16:10:15.39ID:k7iFif1Jd
チープな環境ではコードサイズが増えるのは致命的
2023/01/27(金) 16:17:02.37ID:a+0fKe/I0
>>248
「組み込みのチープな環境」で組んでたことあるけど、心当たり無いよ。
コードサイズだって手書きなりマクロなりでも必要量は同じになるだろうし。
何か例でも挙げてみてもらえる?
2023/01/27(金) 16:29:51.65ID:B8oMym/70
>>246
テンプレート自体が実行性能の足を引っ張るってことはないが
個々の場面でより性能よく書けるはずのときに汎用部品で済ましてしまうってことはあるんじゃない?

そういうときでも個々の箇所をいじるよりは特殊化を足すだけで済むほうが楽だと思うが。
2023/01/27(金) 16:34:12.21ID:k7iFif1Jd
同じ結果になるように書けばそりゃ同じだろう
テンプレートで楽をすればコードは(一般的には)増える

memcpyで済む物が
型別にコードが発生したり

そういう所を気にすると結局楽が出来ない
2023/01/27(金) 16:37:07.22ID:k7iFif1Jd
>>253
全て特殊化したら楽が出来ない
手間が増えるだけ
2023/01/27(金) 16:40:41.26ID:k7iFif1Jd
10種類のテンプレート引数で使うコードは
基本的には10個のバイナリが生成される

10種類手で書けば
当然コードの共通化を(人間が)考える
2023/01/27(金) 17:11:02.52ID:B8oMym/70
>>255
必要なとき、効果があるときというのは当然の前提やが。
早すぎる最適化は諸悪の根源。 雑に書いて動くようになってから必要に応じてチューニングするもんやで。
2023/01/27(金) 17:18:26.40ID:k7iFif1Jd
>>257
リッチな環境前提の発想
初めから考えないといけないチープな環境もある
2023/01/27(金) 17:22:03.06ID:6glVv8Ll0
Embedded C++やってろ
2023/01/27(金) 17:22:16.96ID:7yNCo9mI0
非力なハードで無理目なことをギリ勝負でやるときはアセンブラだろ
2023/01/27(金) 17:22:48.21ID:k7iFif1Jd
実際PC用コードの多くは組み込みでは全く使えず
ほとんどゼロからの開発になる
2023/01/27(金) 17:24:10.47ID:k7iFif1Jd
>>260
もちろん必要ならアセンブラも使うが
CやC++による最適化が先
2023/01/27(金) 17:24:25.29ID:6ZIN/roZ0
そういう環境ってそもそも標準ライブラリ揃ってなかったりしない?このスレで扱う必要ある?
2023/01/27(金) 17:25:27.76ID:k7iFif1Jd
>>263
標準ライブラリのスレではないから
2023/01/27(金) 17:32:21.49ID:k7iFif1Jd
ぬるま湯環境しか知らないはちみつ
もう少し視野を広げた方が良いかと
2023/01/27(金) 17:50:48.85ID:7yNCo9mI0
なんかやたらマウント取りたがるな
2023/01/27(金) 17:55:50.00ID:6ZIN/roZ0
学校でC++03教えてそう(笑)
2023/01/27(金) 18:01:40.26ID:B8oMym/70
ワイは Z80 時代を生きたおじさんやぞ。
いまどきチープな組み込みでも最初からそんなカリカリにチューニングするのはそんなにないやろ。
無いとは言わんけど C++ の利用例としては例外的やわ。
2023/01/27(金) 18:16:51.47ID:tKRPgB5dd
カリカリチューンとぬるま湯コーディング
はちみつの頭の中はどっちかしか存在しないのかよ
2023/01/27(金) 18:24:03.96ID:7yNCo9mI0
人のことを小馬鹿にするだけなやつ出てけよ
プログラム技術の話の邪魔だ
2023/01/27(金) 18:25:43.08ID:ESaqgTdPd
>>249が書いても説得力ゼロ
私は>>240でもないんだけど
2023/01/27(金) 18:28:51.80ID:7yNCo9mI0
は? 俺は技術の話をしている
途中で根拠も挙げずに変なことを言うやつにチクリとやったが
貴様と違いそれだけじゃねえんだよボケ
2023/01/27(金) 18:30:54.17ID:cYktn2Sdd
根拠あるじゃん
2023/01/27(金) 18:31:53.95ID:cYktn2Sdd
おれがいくつか書いた
2023/01/27(金) 18:32:25.20ID:7yNCo9mI0
どこにだよ
しどろもどろな返事だなスカタン
2023/01/27(金) 18:33:01.59ID:cYktn2Sdd
日本語読めない人かな?
2023/01/27(金) 18:38:13.74ID:7yNCo9mI0
ないものは示せないもんな
せいぜいそんな言い訳にもなってないことを勝手にぬかしてろ
俺はこれから夕飯作らにゃならんし害虫が出てくのを待つ意味でもしばらく落ちる
2023/01/27(金) 19:53:44.64ID:B8oMym/70
>>269
文脈見ろ。 それは >>265 に対して言ってんだぞ。
2023/01/27(金) 19:59:17.27ID:RxpK1TrS0
10種類とかで肥大するのはテンプレートなのにデカい関数作るからやろ
共通化できる部分は型に依存しない箇所だからテンプレートだろうと外に出せる
280デフォルトの名無しさん (ワッチョイ 6301-H6v1)
垢版 |
2023/01/27(金) 22:01:21.69ID:GkVPt6s00
>>270
それお前やろ
2023/01/27(金) 22:06:41.58ID:rBkTgp9F0
www
2023/01/27(金) 22:15:36.78ID:y5pwToDP0
孤独のグルメじゃないけど「こういうのでいいんだよ」が最適解なこと多いよな、C/C++
2023/01/27(金) 22:37:05.53ID:kTII8Zcn0
あまりゴチャゴチャさせずにシンプルイズベストよな
2023/01/27(金) 22:40:45.09ID:Tnyv3fMqM
C++20 のビューとやらを使ってみてるんだがデバッガで見づらすぎるのどうにかならん?
2023/01/27(金) 23:34:33.68ID:qVpyYaSyM
>>237
template<int N = 100> class A{
 static int nnn{N};
};
とすると、
A<123>::nnn が 123 になるはず。
static を付けない場合は、インタンスオブジェクトに対して取得できる。
2023/01/28(土) 15:20:49.48ID:x4SDzju+0
これは>>239が面白いな
2023/01/28(土) 15:29:40.57ID:ys7yM/+j0
>>286
ありがとう
誰も反応しなくてつまらんかった
2023/01/28(土) 15:40:35.35ID:x4SDzju+0
>>238
constexprの方が良いのかな?
static constexpr int nankanokosuu = N

>>285
constかconstexprかが必要
それはさておき初期化の位置に使っている中括弧 {N} はなに?
289デフォルトの名無しさん (ワッチョイ db76-xF8Z)
垢版 |
2023/01/28(土) 16:15:40.82ID:gfTDhobA0
単に初期化で使ってるだけでしょ
今回はintであることが明白だから=でも()でも{}でも初期化できるけど

この手のコンパイル時に決まるやつはstatic constexpr一択だね
array<T, nankanokosuu> a;みたいに他のテンプレート引数に使える
2023/01/28(土) 16:18:27.56ID:TUmaQinN0
constexprにするとコンパイル時に解決出来ない項目は弾かれてしまうからconstのままでいい
知らないなら余計な修正は加えるな
2023/01/28(土) 16:50:45.80ID:x4SDzju+0
>>290
>>237のケースではtemplate引数のNを受けるのだから
コンパイル時に決まっているのでは?
コンパイル時に決まっていることが含意された
constexprの方が良いと思うけど?
2023/01/28(土) 17:08:38.28ID:1oumyOI/M
>>288
>それはさておき初期化の位置に使っている中括弧 {N} はなに?
C++11位から導入された初期化の一種。
a{N}は、a = N とほぼ同じだが、縮小変換をしないということや、
「どんな場所でも必ず使える」特徴があると言われており、Stroustrup氏
は、= よりも {} を推奨している。
また、{} による初期化は「直接初期化」と関係が深く、= による初期化は
「代入初期化」と関係が深い。
2023/01/28(土) 22:18:12.18ID:x4SDzju+0
>>292
なるほどC++11以降なのね
「縮小変換」「直接初期化」「代入初期化」がよく分からんが
2023/01/28(土) 23:35:50.70ID:JY7EfERdM
>>293
「直接初期化(direct initialization)」とも関係しているが、
{}による初期化は、「一様初期化 (uniform initialization)」
で検索すると出て来やすい。
なお、ネットでdirect initializationを検索しても間違った定義が出てくるかも知れない。
2023/01/29(日) 00:27:43.05ID:2zmXfTjk0
>>294
なるほど「直接初期化」と{}による初期化(= [一様初期化])は分かった
[一様初期化] https://cpprefjp.github.io/lang/cpp11/uniform_initialization.html
[直接初期化] https://learn.microsoft.com/ja-jp/cpp/cpp/initializers?view=msvc-170
「縮小変換」と「代入初期化」が分からん
「代入初期化」は=による初期化のことを言ってるのかな?
2023/01/29(日) 12:04:49.28ID:l1ZINGQtd
C++17のcopy elisionでルール変わったね
2023/01/29(日) 13:42:04.03ID:uP7zelejM
>>295
正しい定義かどうかは分からないが、一応、
「直接初期化」「コピー初期化」については、英語版の en.cppreference.com
をそれぞれ
「direct initialization」「copy initialization」
で検索すると「パターン」一覧が出てくるみたいだ。
ただし、一覧については「全てのパターン」かは定かではない。
例えば、direct initialization については、一覧には、new T(XXX) しか出てないが、
new T{XXX} でも良いハズ。
298デフォルトの名無しさん (オイコラミネオ MM63-ZqoR)
垢版 |
2023/01/29(日) 13:47:49.42ID:uP7zelejM
>>297
https://en.cppreference.com/w/cpp/language/direct_initialization

T object ( arg );
T object ( arg1, arg2, ... ); (1)

T object { arg }; (2) (since C++11)

T ( other )
T ( arg1, arg2, ... ) (3)

static_cast< T >( other ) (4)
new T(args, ...) (5)
Class::Class() : member(args, ...) { ... } (6)
[arg](){ ... } (7) (since C++11)

[説明]
* (5)は、() しか出てないが、{} でも可能 :
new T(args, ...) (5)
new T{args, ...} (5')

* (3) も、() しか出てないが、{} でも可能で恐らくother でなくてもいい筈だ(定かではない) :
T ( other )
T ( arg )
T ( arg1, arg2, ... ) (3)
T { other }
T { arg }
T { arg1, arg2, ... } (3’)
2023/01/29(日) 13:56:42.30ID:uP7zelejM
>>295
>「縮小変換」と「代入初期化」が分からん
>「代入初期化」は=による初期化のことを言ってるのかな?
縮小変換は、検索すると出てくる。
「代入初期化」という言葉は、俺の記憶違いだったらしく、「コピー初期化」
が正しかったようだ。難しい。
2023/01/29(日) 14:05:48.45ID:uP7zelejM
ここが分かり易いかな:
「Is it direct-initialization or copy-initialization?」
https://stackoverflow.com/questions/46634869/is-it-direct-initialization-or-copy-initialization
2023/01/29(日) 20:57:42.75ID:2zmXfTjk0
>>299,300
なるほど「縮小変換をしない」とは
例えば以下でエラーになるってことね
int a {1.0};
「コピー初期化」ってのはコピーコンストラクタを呼ぶ初期化
あるいはコピーコンストラクタ自体のことで良いのかな?
2023/01/29(日) 23:00:33.52ID:JRnzhQFiM
>>301
>「コピー初期化」ってのはコピーコンストラクタを呼ぶ初期化
>あるいはコピーコンストラクタ自体のことで良いのかな?
個人的には、
CPerson::CPerson( CPerson const &rPeson )
の形式のコンストラクタがコピーコンストラクタで、
それを使う初期化がコピー初期化、と思って今まで生きてきたが、
それだと、「直接初期化」の対比の意味のものとは違っているように思える。
どこかで、言葉の混乱が起きているかも。
分からない。
2023/01/29(日) 23:11:23.60ID:JRnzhQFiM
>>302
一部の例外を除いては、「コピー初期化」とは、= が書いてある初期化で、
「直接初期化」とは、= が書いて無い初期化、だといわれている。
但し、沢山例外があって、
T x = T(a);
などは、直接初期化なんだそうだ。
また、return a などは、コピー初期化、なんだそうだ。
記憶に頼っているので間違っているかも知れない。
2023/01/29(日) 23:20:25.89ID:ppqTPlns0
コピコンか代入か明示するためのexplicitよ
2023/01/30(月) 01:17:26.91ID:kRDQpz8S0
>>302
コンストラクタはどれも直接初期化に使えるコンストラクタだけど
一定の形式を満たすものはコピー初期化の文脈「でも」使えるってだけ。

>>303
> T x = T(a);
> などは、直接初期化なんだそうだ。

これについて形式的にはあくまでもコピー初期化の一種ということになる。
https://timsong-cpp.github.io/cppwp/n4659/dcl.init#15
その上でコピーの省略が起きて結果的には直接初期化と同じ挙動になる。
https://timsong-cpp.github.io/cppwp/n4659/class.copy.elision#1
2023/01/30(月) 16:11:51.36ID:S2+yDPxmM
記憶に頼って書くけど、
1. 1つの引数を持つコンストラクタは、explicit修飾することが推奨されている。
2. explicit指定が無いと、そのつもりは無い「ひょんな場所」で勝手に変換コンストラクタとして
 利用されてしまうことがある。特に関数に引数を渡す場合に起き易いらしい。
3. CPerson::CPerson( CPerson &rPerson ) は、同じ型を単純にコピーする
 コンストラクタであるから、そもそも型の変換はしないので変換コンストラクタでなく、
 「コピー・コンストラクタ」と言われる。
4. つまり、CPerson::CPerson( AAA &rAAA ) のような場合に
2023/01/30(月) 16:18:21.06ID:S2+yDPxmM
>>306
[誤送信してしまった。スマソ]
4. つまり、CPerson::CPerson( AAA const &rAAA ) や CPerson::CPerson( int &rX )
 のような場合に explicit 指定することが推奨されていたと思う。

T x = T(a);

の場合、「C++のからくり」のような昔の解説書だと、最適化に任されているのではなく、
特別処理されているようなニュアンス(?)で、T x(a) と同じだと書いてあった。
もし、特別処理されてないと考えた場合、= の部分だけに着目すれば、T::T( T const &rX ) という
コピーコンストラクタの呼び出しと意味論的には考えて考えられなくも無い。
そうするとそこは「変換コンストラクタ」ではなく「コピーコンストラクタ」が使われることになる。
コピーコンストラクタはいくら使っても速度が遅くなる以外は劣化やデータの変化が無いため
無害と言えば無害。なので、explicit が付いていてもいなくても余り関係が無いような気がする。
2023/01/30(月) 16:24:16.09ID:S2+yDPxmM
>>307
[補足]
void f(T x);
に対して、
U a;
f(a);
と書くと、実引数aが仮引数xに渡される時の動作は、「コピー(?)初期化」と考えられて
いる。もしかしたら言葉は正しく無いかもしれないが、少なくとも「直接初期化」には
分類されないということ。
そしてexplicitが付いて無いコンストラクタは、このような初期化に対しては用いられ
ないことが保証されると書いてあったと思う。
2023/01/30(月) 16:25:22.84ID:S2+yDPxmM
>>308
[訂正]
誤: そしてexplicitが付いて無いコンストラクタは、このような初期化に対しては用いられ
  ないことが保証されると書いてあったと思う。
正: そしてexplicitが付いている無いコンストラクタは、このような初期化に対しては用いられ
  ないことが保証されると書いてあったと思う。
2023/01/30(月) 16:26:12.39ID:S2+yDPxmM
>>309
[再訂正]
誤: そしてexplicitが付いている無いコンストラクタは、このような初期化に対しては用いられ
  ないことが保証されると書いてあったと思う。
正: そしてexplicitが付いているコンストラクタは、このような初期化に対しては用いられ
  ないことが保証されると書いてあったと思う。
2023/01/30(月) 16:50:51.20ID:S2+yDPxmM
>>304
explicit指定の主な役割は、変換コンストラクタにexplicit修飾しておくことで
「変換コンストラクタが知らず知らずのうちに勝手に使われてしまう事」
を防げる、ということだったと思う。
2023/01/30(月) 16:53:41.85ID:BI3s5DYMd
regexやthreadのexplicitが邪魔
2023/01/30(月) 17:25:41.99ID:kRDQpz8S0
>>306
explicit を付けることは推奨されているわけじゃない。
推奨している人もいるけど普通は必要に応じて使い分けるよ。
明らかに変換を意味しないようなコンストラクタになっちゃうこともあるから気を付けろという程度の話。

たとえば vector は size_t を受け取るコンストラクタがある (指定サイズ分の大きさになる) がそれには当然 explicit が付いてる。
整数が vector に変換されるのは明らかにおかしいから。
char* から string への変換みたいな自然な変換では困らないし、あるほうが便利。

>>307
> 特別処理されているようなニュアンス

かつてはその場合はコピーの省略が許される (しなくてもよい) という仕様だった。 (今の仕様だとコピーの省略が必須。)
コピーコンストラクタは必ずしもコピーをするだけではなくなんらかの副作用を引き起こしても良いので
コピーの省略の有無によってプログラムの意味が変わってしまう。
プログラムの意味を変えない範囲で処理系が行う通常の「最適化」とは異なるという意味では特別扱いだ。
2023/01/30(月) 17:35:07.72ID:c/LsY66H0
難しいなぁ。。。
ubuntu の g++って 11.1以降だから、c++23だったのね。
すご って思いました。
2023/01/30(月) 19:37:46.73ID:BI3s5DYMd
C++2bはまだドラフトだよ
2023/01/30(月) 20:58:31.18ID:rMqdSurOM
>>313
>たとえば vector は size_t を受け取るコンストラクタがある (指定サイズ分の大きさになる) がそれには当然 explicit が付いてる。
>整数が vector に変換されるのは明らかにおかしいから。
>char* から string への変換みたいな自然な変換では困らないし、あるほうが便利。
なるほど。そうだったのか。
勉強になりました。
2023/02/02(木) 23:34:11.97ID:Ce1dvKO2a
C++やるとどんな言語も使えるとか言うけどNode.jsも数時間あれば使いこなせるの?
あれは言語じゃないでしょって言われそうだがjavascriptともhtmlとも違くて別言語に思えるんだけど
2023/02/02(木) 23:52:01.04ID:zSdJjx9q0
誰が言ってるの?

こっちでやるべきだと思うぞ
https://mevius.5ch.net/test/read.cgi/tech/1427572389/
2023/02/03(金) 00:10:02.14ID:GSbNqAeQ0
C++出来ます‼ってのはC言語上がりのなんちゃってチャソも含まれるから一概には言えない
2023/02/03(金) 00:27:17.07ID:cvg0vFRY0
>>317
C++ を使っていれば低レイヤの事情やシステム全体の関連を知る機会があるし、
言語処理系がどう実装されるのか (低レイヤの視線から見てどう動くのか) を知っていれば
常識的な言語デザインの感覚がわかる。 (言語仕様を類推しやすい。)
C++ を使いこなしている状況からなら色々と理解しやすいという効果がないとは言えない。

ただ、あくまでも C++ を使いこなせるようになる過程で言語自体以外にも身につくことがあるという部分が効いてくるので
C++ の言語仕様の知識はそれほど役に立つわけではないし、さすがに数時間で Node.js を使いこなせるということはない。
2023/02/03(金) 00:44:48.46ID:7WbTLk8Ha
quoraとか知恵袋とかブログで「Cの次はC++をやればオブジェクト指向身について更にCから派生した言語が主流だからどんな言語も直ぐ理解できる」みたいなの多いよ
だからこのスレの人達ならNode.jsも余裕なのかなって

>>320
学ぶ過程の色んな経験が生きるって事か。そりゃそうだよね
2023/02/03(金) 01:31:41.47ID:cvg0vFRY0
>>321
JavaScript は C 風の外観を持ってこそいるけど動的型、かつ、プロトタイプベースであるという点で
根本的に異なるメカニズムなわけでこういうのを「C から派生」と呼んでよいのかどうか……。
2023/02/03(金) 07:32:32.82ID:gaR1XNY40
よく使う言語と比べて在るもの無いもの違うわけで
ちゃんと理解しようとしたらそれなりに時間がかかるでしょ
気軽に使いこなすとか言葉にしてると怖いおじさんに怒られるぞ
2023/02/03(金) 08:03:03.43ID:HPBiMoRp0
そもそも理解しやすいと使いこなせるは別の概念やろ
2023/02/03(金) 09:08:55.43ID:b6b2xU8/0
vector<int>& a = c, b = c;
としたときに、bがcの参照になりませんでした。
&が後ろにかかるからかと思って
vector<int> &a = c, &b = c;
としても結果が変わりませんでした。
vector<int> &a = c;
vector<int> &b = c;
とすればやっと期待通りの動作になりました。
参照の宣言と初期化は複数をカンマで区切って一行で書くことは不可能なのでしょうか?
2023/02/03(金) 09:24:27.07ID:GSbNqAeQ0
え?コンパイラなに使ったの?
> vector<int> &a = c, &b = c;
> としても結果が変わりませんでした。
処理系ぶっ壊れてんのかな
2023/02/03(金) 12:28:10.97ID:31rfnruOM
c言語スレで質問したのですが
スレ違いとのことでしたので
改めて質問致します。

c言語の標準入出力ストリームの
本当に基本的なことなんですが
わからずに困っています。
教えてください。

std::ofstream stream;

ostream << "ABCEFG";

この入力した文字列の"ABCEFG"を
右側3文字を削除して"ABC"にするには
どうすれば良いのでしょうか?
2023/02/03(金) 12:36:10.39ID:l5lsJ9Ru0
カーソルをEのところに持ってきてDeleteキーを3回押す
またはカーソルをGの右の"の上に移動してBSキーを3回押す
2023/02/03(金) 13:21:17.85ID:cQeyOYIBM
>>327
質問の意味が分かりにくい。
それだと入力ではなく出力になっている。
出力したものを取り消すのは基本的に難しい。
2023/02/03(金) 13:24:04.52ID:cQeyOYIBM
>>329
[補足]
std::string str = "文字列";
の場合、
str.substr(開始位置, 取り出す長さ);
で部分文字列を作れるので、
std::string str = "ABCEFG";
の場合、
std::string str2 = str.substr(0, 3);
で str2 に "ABC" が入る。
331デフォルトの名無しさん (ラクッペペ MM4f-zLlH)
垢版 |
2023/02/04(土) 10:43:22.05ID:amDpu8JYM
>>330
回答ありがとうございます。

あれから自分でも調べて
seekp()でファイル内位置を移動するなど
試してみたのですがうまくいきませんでした。
(修正の方向はあっていると思うのですが・・)
やはり>>330さんの言う通り、テキストの削除は難しくする
何かわかりませんがそういう思想があるみたいに感じました。

そこで自分も細かい編集は別に改めて行って
結果をまとめてstreamに出力する方法に切り替えました。
結果はOK、どうもありがとうございました。

tstring_t str = _T("ABCDEFG");
str.erase(str.size() - 3);
stream << str;
2023/02/04(土) 11:10:24.50ID:e1OBQ9Uv0
>>331
それは環境依存の機能だと思う
UNIXだとmmapとか?
333デフォルトの名無しさん (アウアウウー Sa93-fxZT)
垢版 |
2023/02/04(土) 11:41:36.65ID:9C/WLP1pa
>331
seekp seekg
tellp tellg
読み込み用と書き出し用でポインタが二つあるので
自分で思ってるのと違う場所になってるのかも
方向性はあってるはず
間違ってたらすまん子
2023/02/04(土) 14:37:50.00ID:cBqi3lSD0
>結果をまとめてstreamに出力する
これで済むなら、これこそが正道
必要のない出力をして後から切り詰めるなんて愚の骨頂
そうしなきゃならない理由があるならしょうがないけど
2023/02/04(土) 16:23:00.83ID:12Q26erYd
>>331
テキストじゃなくてファイルの削除でしょ
そういう細かい言い間違いが多いから伝わりにくい文章になってると思う
ファイルに出力する前にメモリー上で編集済ますのは当たり前でファイルアクセスにはメモリよりも時間がかかるから
そういった基本を知ってたほうがいいプログラムを作れるよ
2023/02/04(土) 17:43:09.03ID:amDpu8JYM
>>335
いやファイルじゃなくてテキストですよ
右側3文字を削除って書いてるじゃないですか
何かの病気・・?
2023/02/04(土) 17:45:16.88ID:NGTrSsWja
アホの謎の上から目線
2023/02/04(土) 19:15:57.04ID:EmptyAuWd
>>336
ひょっとしてファイル上に出力した状態をテキストと呼んでるのか

メモリ上かファイル上かの区別でそんな呼び方はしない
思想とかじゃなくてメモリとファイルにはそういう性質があるってだけ
早とちりの激しい人のようだな
2023/02/04(土) 19:36:14.65ID:YYLIzwcR0
お前も人に言い間違い云々とか言う前にファイルの削除とか書くなよ...
せめてファイルのテキストから削除とか書かないと意味わからんだろ
340デフォルトの名無しさん (ラクッペペ MM4f-zLlH)
垢版 |
2023/02/04(土) 19:47:05.93ID:amDpu8JYM
>>338
いや全然違うよ、もっと基礎的な話で
C言語の標準入出力ストリームでのテキスト出力の話をしているの。
(C++の文字列クラス std::stringとはまた別)

>>327
ostream << "ABCEFG";
はテキストの書き込み処理だけど、
これをやっても内部のバッファに書き込まれるだけで
HDDファイルなどの真の書き込み先には書き込まれないの。

//ostream << std::fflush;
仮に上の関数を呼ぶことで初めてHDDファイルなどに書き込まれるの。

んで、入力されてまだフラッシュされていない文字列"ABCEFG"を
右側3文字を削除して"ABC"にするには
どうすれば良いのでしょうか?
ってのが私の質問なんです。
OK?
2023/02/04(土) 20:05:08.56ID:NNW9UvjL0
std::printってなんすか?鬱陶しいstream要らなくなりますか??
2023/02/04(土) 20:22:02.19ID:Uc49lFdn0
>>340
std::flushは呼び出し後にバッファがフラッシュされることを保証するだけで、書き込みをするタイミングは未規定(pstreamの勝手)
ostreamはoperator<<が呼ばれたそばから全部書き出してもいいし、バッファを半分ずつとか書き出してもいいしそれはostreamの自由
「入力されてまだフラッシュされていない」なんていう状態はostreamが教える義理はないし真っ当な方法では外からは観測できないしするべきでもない
ましてそれを弄くろうなんて考えるのがカプセル化を無視した間違った考え方だ
2023/02/04(土) 20:26:28.53ID:b1h/gALG0
なんだろね。std::formatだけでは効率が悪かったのかな?
2023/02/04(土) 20:26:47.52ID:KFFsFRScM
>>340
C++のSTLには、ファイルではないstreamの中に、そういう機能を持つものがあり、
atoi()の代わりに用いる例が出ていた。
それは入力と出力が可能なstreamで、文字列を出力しておいて、整数型として
入力することが出来る。
それが出来るということは、語尾を削除することも出来そう。
2023/02/04(土) 20:59:53.67ID:KFFsFRScM
全く確認できてないが、。
stringstring s;
s << "ABCDEF";
string s2;
s >> setw(3) >> s2;
で s2 に "ABC" が読み込めるかもしれない。
誰か確認して候。
2023/02/04(土) 21:06:47.02ID:e1OBQ9Uv0
>>345
-stringstring s;
+stringstream s;
で読める
■ このスレッドは過去ログ倉庫に格納されています
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況