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

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

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

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

Q&A

3回答

2986閲覧

C++ ファイル名を連番で10個生成し、無限ループ

Turkeyman

総合スコア3

C++

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

0グッド

0クリップ

投稿2021/08/02 04:30

編集2021/08/02 06:46

前提・実現したいこと

C++にて、ファイルサイズが5000KBになったら、そのファイルをコピーして、コピーしたファイル名を~1.txtのようにリネームしたい。これを10個連番で作成し、元ファイルをコピーして~2.txtで保存、元ファイルの中身をコピーして~3.txtで保存・・・を無限ループで処理したいです。が、うまくいきません。
エラーメッセージもどんなこと書いてあるか調べましたが、意味が分かりませんでした。
なにか簡単にできる方法はありますか?無知で初心者なのでよろしくお願いします。

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

エラー 13 error LNK2001: 外部シンボル ""int __cdecl pg_sprintf(char *,char const *,...)" (?pg_sprintf@@YAHPEADPEBDZZ)" は未解決です。

該当のソースコード Main()

char buf[100][1024]; char filename[]="test"; char fileext[]="txt"; int i = 0; if (test.Size() >= -5000000) { sprintf(buf[i], "%s%d.%s",filename, i + 1, fileext); } else if (i == 1 && test.Size() >= -5000000) { sprintf(buf[i], "%s%d.%s",filename, i + 2, fileext); } ・ ・ ・

Size()

int CcopyCollect::Size() { //テキストファイルの容量を求める ifstream ifs(F, ios_base::binary); streamsize size = ifs.seekg(0, ios::end).tellg(); ifs.seekg(0, ios::beg); return size; }

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

Visual studio 2012 C++

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

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

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

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

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

nob.

2021/08/07 02:56

「…未解決です」について。 「解決する」とか「未解決」はコンパイラ(正しくはリンカ)の用語です。 「Xが未解決」とは 「何処を探してもXなんてないぞ!」 と言ってます。 質問の場合は pg_sprintf() 何処からか探してきて、リンカに「…にあるよ」と教えるか、pg_sprintf()を呼び出している所を削除するか、自分で pg_sprintf() を作るかして下さい。
guest

回答3

0

epistemeさんとのやり取りも読みましたが、先に仕様を決めるべきです。

というか、基礎すらできていないイメージです。

実行すると上記のようなエラーが出ます。エラーから修正しないといけない感じですかね。
リンクに失敗してるんだから実行すらできないはずでは?
実行できないです。
(以降、省略)

全く噛み合っていません。

まず、コンパイルとリンク、実行は分けて考えるべきです。

コンパイル: 機械が読める言語に翻訳すること

リンク: コンパイルされたobjファイルを繋げて一つの実行ファイルにすること(DLLの場合もあるが)

実行: 実際に動かすこと

です。

VC++とかの場合はこのコンパイルから実行までを一つの動作としてまとめてやっているだけです。

そして、エラーにも種類があります。

コンパイルエラー: コンパイラが吐くエラー。構文ミスやスペルミス等でコンパイラが解釈できないことが原因

リンケージエラー: リンカ(リンクを行うソフト)が吐くエラー。必要なobjファイルがないとかが原因

論理エラー: if文とかの条件式がまちがっているとかで、ロジックがおかしく、
実行結果が違ってくるエラー

急にクラッシュする: 配列でありえない場所(アクセス可能な要素数を超えているとか)にアクセスしているとかが原因であることが多い(他の言語だと例外が飛んでくるはず)

他にもあるとは思いますが、ざっとエラーというだけでもこれだけあります。

なので意思疎通ができていません。

メッセージを読む限り、リンケージエラーです。
ですが、質問者さんは『実行はできている』というのです。

頭にハテナが浮かびますね。

それにpg_sprintf関数ってのはなんでしょうか。

少なくともC言語やC++にはありませんね。

検索してみるとポスグレ? データベースのやつらしいですね。

そう言う場合はリンクが必要です。

おそらく質問者さんはリンクすらしていないのでは。

VC++ は使っていないのでわかりませんが、設定する方法があるはずです。
それを使ってリンクしましょう。

そうすれば今回の質問にあるリンケージエラーは回避できます。
(他のエラー原因がなければ)

まずは検索しましょう。

ヒント: 設定からやる方法

ヒント: コードからやる方法

バージョンのやつはあえて適当に選びました。バージョンが違うならご自分で調べてください。
検索力も必須です。

でも先に仕様を決めましょうですね。

たとえば、「同じファイル名になったらどうするか」とかですね。

投稿2021/08/07 02:38

BeatStar

総合スコア4962

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

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

0

error LNK2001: 外部シンボル ""int __cdecl pg_sprintf(char *,char const *,...)" (?pg_sprintf@@YAHPEADPEBDZZ)" は未解決です。

PostgreSQLのライブラリ使ってますか? そのライブラリ旧くないですか?

投稿2021/08/02 07:04

episteme

総合スコア16612

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

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

Turkeyman

2021/08/02 08:33

ライブラリが古いとはバージョンのことですか?
episteme

2021/08/02 09:25

です。 # てかそもそもコンパイラが旧い(10年前)のはなにかの制約条件?
guest

0

C++

1int CcopyCollect::Size() 2{ 3 //テキストファイルの容量を求める 4 ifstream ifs(F, ios_base::binary); 5 6 streamsize size = ifs.seekg(0, ios::end).tellg(); 7 ifs.seekg(0, ios::beg); 8 9 return EXIT_SUCCESS; // [*] 10}

EXIT_SUCCESS を返すんですか? sizeじゃなくて?

投稿2021/08/02 05:09

episteme

総合スコア16612

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

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

Turkeyman

2021/08/02 05:22

いじり忘れてました。
episteme

2021/08/02 05:25

とすると、Main() : test.Size() >= -5000000 とは? size >= 0 だろうから、この条件式は必ず真となりますが。
Turkeyman

2021/08/02 06:44 編集

すみません。どういうことですか?条件式がおかしいということですか?if文の中にif文を書いていけば条件が成立するってことですか?「test.Size() >= -5000000」はファイルのサイズが5000KBになったらリネームするという条件を書いているつもりでした。一応、if文の中にリネームではなく違う処理を書いた結果、条件通りに動きます。
fana

2021/08/02 06:54 編集

右辺のマイナスは何なの? 例えば「xが100以上ならばどうの」っていうのを,ふつーに考えると if( x >= 100 ){ ... } って書くと思わない? それを if( x >= -100 ){ ... } //右辺が何故か-100 って書く理由(意図)は何か? 本当にそれでOKなのか?
episteme

2021/08/02 06:56

いや、"マイナス500万バイト以上”って? 絶対真になってif文の意味なくない?
Turkeyman

2021/08/02 07:05

質問をする前にマイナスなしで試した結果動かなかったので、テキストファイルにファイルのサイズを出力させてみたらマイナスがついていましたので、マイナスを付けました。
episteme

2021/08/02 07:08

ifs.seekg(0, ios::end).tellg() がマイナスだったと? ちょっとあり得ないんだが。
fana

2021/08/02 07:12

(あっ,ダメだ.行動原理に何の理もないタイプだ.)
Turkeyman

2021/08/02 07:16

すみません。私の勘違いで、何も書かれていないときにサイズを求めたら-1と出てきたので、-が正しいと判断してつけてました。
episteme

2021/08/02 07:19

それか... tellg() は失敗したら-1を返すぞ。
Turkeyman

2021/08/02 07:22 編集

あれは失敗してたのですね...覚えておきます。ありがとうございます。
episteme

2021/08/02 07:27 編集

「・・・を無限ループで処理したいです。が、うまくいきません」を説明してほしいんだが。 質問にある「リンクエラーが発生する」ことが"うまくいきません"なのか? それとも ファイルサイズが正しく求まらないことか? # 質問ヘタクソ
Turkeyman

2021/08/02 07:44

とあるテキストファイルAがあるのですが、そこに別で動いてる処理のログを書いています。永遠に描き続けていると重くなるので、Aに書かれているログを軽い状態で確認するために、5000KBになったらAをコピー&リネームして、...1~10.txtのファイル名で作ろうと思っています。10個以上になりかけたら、古いファイルの...1.txtにAのデータを上書きさせたいです。これを永遠に繰り返すために無限ループで処理したいと思っています。 リンクエラーのことは、書いてある処理があっているのであれば解決したいのですが、処理が違うのであればまずは処理から修正したいと思っています。
episteme

2021/08/02 07:47

それはわかったから "どう"うまくいかないのか を説明せよ、と。
fana

2021/08/02 08:02

Aが5000KBになった→コピー1つくります→Aはまだ5000KB以上だよね→コピー2作ります→…(以下,怒涛の勢い) みたいな残念なことにならないためには,コピーを作る毎にAの内容を抹消しなきゃならんように思うけど, Aにログ吐いている側は唐突にファイル消去とかされても大丈夫なのだろうか?
Turkeyman

2021/08/02 08:14 編集

コピーを作る毎にAの内容を抹消するコードはできています。書かれていませんが付け足しています。
episteme

2021/08/02 08:14

~1.txt , ~2.txt, ... ~9.txt が既に存在するとき、次に作るのはどれなん? 最後に作ったヤツをアプリが覚えてるん? そのアプリを一旦落として再起動しても問題ない?
Turkeyman

2021/08/02 08:44

次に作るものは10でその次は1に戻ります。最後に作ったやつをアプリが覚えることは可能なのですか?覚える方法はリストを作ってそこに入れるってことですか?再起動はまずいです。
episteme

2021/08/02 09:22 編集

だからそこらへん仕様決めんと実装しようがないじゃろ # 利用者は複数のbackup-fileのどれが旧い/新しいか、タイムスタンプで判断するん? で、まだ「うまくいきません」の説明が得られていません。なにが/どう うまくいかんのですか?
Turkeyman

2021/08/02 09:52

実行すると上記のようなエラーが出ます。エラーから修正しないといけない感じですかね。
episteme

2021/08/02 14:22

リンクに失敗してるんだから実行すらできないはずでは?
Turkeyman

2021/08/03 23:56

実行できないです。
episteme

2021/08/04 00:12

「実行すると上記のようなエラーが出ます。」は誤りなのね?
Turkeyman

2021/08/04 05:34

エラーメッセージはでます。誤りではないです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問