私はテキストファイルを持っています。テキストファイルに10行があるとします。 3行目と6行目を入れ替えたいです。テキストファイルの行を入れ替える方法は?
どうすればいいですか?また、私はスワップのための一時ファイルを作成することはできません。
私はテキストファイルを持っています。テキストファイルに10行があるとします。 3行目と6行目を入れ替えたいです。テキストファイルの行を入れ替える方法は?
どうすればいいですか?また、私はスワップのための一時ファイルを作成することはできません。
警告:これは元のファイルを上書きします!!!
#include <fstream>
#include <vector>
#include <string>
int main()
{
ifstream in("in.txt");
if (in.is_open())
{
std::vector<std::string> content;
for (std::string line; std::getline(in, line);)
{
content.push_back(line);
}
in.close();
std::iter_swap(content.begin() + 2, content.begin() + 5);
ofstream out("in.txt");
if (out.is_open()) {
for (auto i : content)
{
out << i << std::endl;
}
out.close();
}
}
}
私は自分の質問を編集しました –
何も意味がありません?それと同じように、とにかく何かを物語る必要があります。 –
このソリューションを正常に動作させるにはそれが区切り文字として使用されるように、ラインは、単一の空白を含めることはできません。
const std::string file_name = "data.txt";
// read file into array
std::ifstream ifs{ file_name };
if (!ifs.is_open())
return -1; // or some other error handling
std::vector<std::string> file;
std::copy(std::istream_iterator<std::string>(ifs), std::istream_iterator<std::string>(), std::back_inserter(file));
ifs.close();
// now you can swap
std::swap(file[2], file[5]);
// load new array into file
std::ofstream ofs{ file_name, std::ios_base::trunc };
if (!ofs.is_open())
return -1; // or some other error handling
std::copy(file.begin(), file.end(), std::ostream_iterator<std::string>(ofs, "\n"));
C++ 17では、このような関数型を使うことができますが、エラー処理にはあまり適していません。ファンクションスタイルを使用してストリーム例外を発生させることはできず、* open *と* read *エラー(どちらもfailbitを設定)を区別することはできません。これは、ローカルストリーム変数を使用してよりよく行うことができます。 – zett42
@ zett42わかりません。ファイルは最初の条件のために存在します。そして、すべてのバイトは文字として解釈できるので、私は思うような読み取りエラーはありません。だから私はローカルストリーム変数を使用することが利点である理由がわかりません、エラーを設定することはできませんので、なぜそれらを使用するのですか? – Rakete1111
_最初の条件が原因でファイルが存在しています。そのことを確認することはできません。まず、競合状態(https://en.wikipedia.org/wiki/Race_condition)です。つまり、is_regular_file()の呼び出しと1回目のチェックを無効にするifstreamの構築との間に何かが起こる可能性があります。さらに、ファイルのタイプをチェックすることは、ファイルを開くことと同じではありません。タイプを正常にチェックできますが、アクセス権がないためにタイプを開くことができません。 – zett42
テンポラリファイルが必要な場合は... –
テンポラリファイルを作成できない場合は、すべてを行の配列にロードしないでください。プログラム内でスワップし、ファイルを書き換えます。 – AchmadJP
私は自分の質問を編集しました –