VC++ ファイルのソート方法 – プログラミング – Home

VC++ ファイルのソート方法
 
通知
すべてクリア

[解決済] VC++ ファイルのソート方法


k
 k
(@k)
ゲスト
結合: 23年前
投稿: 98
Topic starter  

お世話になります。
ファイル内のレコードをソートして保存したいのですが、
以前、同じような質問されていた方の投稿だけでは分からない部分があり
投稿させていただきました。

↓以前の同じような投稿
http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200202/02020026.txt
手順が下記のように書いてありました。
①ファイルから読む
②並べ替える
③ファイルに保存する

質問1.
①③は別ファイルということでしょうか。

質問2.
もし、①③が別ファイルであれば、①から1行読み込んで、③の先頭から比較し、適当な
位置に挿入するという処理になるのでしょうか。

また、もし、これ以外によいソートの方法がありましたら、ご教授お願い致します。


引用未解決
トピックタグ
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 600
 

全部読み込んでしまっているなら入力となったファイルの中身は捨てても構わないので、
別ファイルでも同一ファイルでも構いません。

#include <iostream> // cout, endl
#include <fstream> // ifstream, ofstream
#include <string> // string
#include <algorithm> // sort
#include <vector> // vector
#include <iterator> // istream_iterator, ostream_iterator, back_inserter

int main() {

std::vector<std::string> body;

{ // 元ファイル作成
std::ofstream stream(data.txt);
stream << zero one two three four five six seven eight nine ten;
}

{ // bodyに読み込む
std::ifstream stream(data.txt);
std::copy(std::istream_iterator<std::string>(stream),
std::istream_iterator<std::string>(),
std::back_inserter(body));
}

// ソート
std::sort(body.begin(), body.end());

{ // 書き出し
std::ofstream stream(data.txt);
std::copy(body.begin(), body.end(),
std::ostream_iterator<std::string>(stream, ));
}

return 0;
}


返信引用
k
 k
(@k)
ゲスト
結合: 23年前
投稿: 98
Topic starter  

お返事ありがとうございます。

元ファイル(data.txt)は、下記のようになっている場合
Yamada Japan
Lucy America
David England

国をソートのキーにして下記のようにしたいのですが・・・
Lucy America
David England
Yamada Japan

再度ご教授お願いいたします。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 600
 

それで? なにが問題なのですか?


返信引用
k
 k
(@k)
ゲスト
結合: 23年前
投稿: 98
Topic starter  

遅くなってすみません。
επιστημηさんのご回答だと、1レコード内の文字列のソートという認識なのですが。
1レコードの1つの項目をキーとしてソートする場合もこのようなやり方でできるのでし
ょうか?


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 600
 

できます。 レコードの比較関数を取り替えればいいのですから。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 600
 

ご参考:

#include <fstream> // ifstream, ofstream
#include <iomanip> // setw, left
#include <string> // string
#include <algorithm> // sort
#include <vector> // vector
#include <iterator> // istream_iterator, ostream_iterator, back_inserter
#include <functional> // less

struct record {
std::string name;
std::string country;
};

// recordの入力
std::istream& operator>>(std::istream& stream, record& r) {
return stream >> r.name >> r.country;
}

// recordの出力
std::ostream& operator<<(std::ostream& stream, const record& r) {
return stream << std::setw(8) << std::left << r.name << r.country;
}

// recordの比較
template<>
struct std::less<record> {
bool operator()(const record& x, const record& y) const
{ return x.country < y.country; }
};

int main() {

std::vector<record> body;

{ // 元ファイル作成
std::ofstream stream(data.txt);
stream << Yamada Japan\n Lucy America\n David England;
}

{ // bodyに読み込む
std::ifstream stream(data.txt);
std::copy(std::istream_iterator<record>(stream),
std::istream_iterator<record>(),
std::back_inserter(body));
}

// ソート
std::sort(body.begin(), body.end(), std::less<record>() );

{ // 書き出し
std::ofstream stream(data.txt);
std::copy(body.begin(), body.end(),
std::ostream_iterator<record>(stream, \n));
}

return 0;
}


返信引用
k
 k
(@k)
ゲスト
結合: 23年前
投稿: 98
Topic starter  

たびたび参考のコードを頂きありがとうございます。

実際に投稿してしていただいたコードを.NETでプロジェクトを作成して
ビルドしたところ下記のようなエラーが出てしまいます。

*****
error LNK2019: 未解決の外部シンボル _wWinMain@16 が関数 _wWinMainCRTStartup で参
照されました。

マイクロソフトのページ( http://support.microsoft.com/default.aspx?
scid=kb;ja;125750#appliesto)でエラーコードを確認して、wWinMainCRTStartupをエン
トリポイントに指定しましたが、同じエラーが表示されてしまいます。

これは、プロジェクトの作りかたに問題があるのでしょうか。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 600
 

'コンソール・アプリケーション'になっていないと思われます。

# わざわざご大層にプロジェクト起こさいでも
# コマンドラインから cl -GX xxx.cpp でええやん。


返信引用
k
 k
(@k)
ゲスト
結合: 23年前
投稿: 98
Topic starter  

>'コンソール・アプリケーション'になっていないと思われます。
コンソールアプリケーションで再作成したら、エラーが解消されました。
どうもありがとうございます。

># わざわざご大層にプロジェクト起こさいでも
># コマンドラインから cl -GX xxx.cpp でええやん。
このような実行方法があるとは知りませんでした。勉強します。

また、ファイルのソートについてもεπιστημη さまに頂いたサンプルをみながら
やってみようと思います。

貴重なご意見・アドバイスどうもありがとうございました。


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 600
 

悪ノリ ── ソートしてないようで、実はしてる ──

#include <fstream> // ifstream, ofstream
#include <iomanip> // setw, left
#include <string> // string
#include <algorithm> // sort
#include <set> // set
#include <iterator> // istream_iterator, ostream_iterator, inserter
#include <functional> // less

struct record {
std::string name;
std::string country;
};

// recordの入力
std::istream& operator>>(std::istream& stream, record& r) {
return stream >> r.name >> r.country;
}

// recordの出力
std::ostream& operator<<(std::ostream& stream, const record& r) {
return stream << std::setw(8) << std::left << r.name << r.country;
}

// recordの比較
template<>
struct std::less<record> {
bool operator()(const record& x, const record& y) const
{ return x.country < y.country; }
};

int main() {

std::set<record> body;

{ // 元ファイル作成
std::ofstream stream(data.txt);
stream << Yamada Japan\n Lucy America\n David England;
}

{ // bodyに読み込む
std::ifstream stream(data.txt);
std::copy(std::istream_iterator<record>(stream),
std::istream_iterator<record>(),
std::inserter(body, body.begin()));
}

{ // 書き出し
std::ofstream stream(data.txt);
std::copy(body.begin(), body.end(),
std::ostream_iterator<record>(stream, \n));
}

return 0;
}


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました