UnixからWindowsに変換するとき、正しい出力が得られます。しかし、WindowsからUnixに移行するとき、私はいくつかの奇妙な出力を得ます。私はキャリッジリターン、 '\ r'の除去が許されなければならないと思った。これはうまくいかない。コードを実行した後にテキストファイルを開くと、奇妙な結果が得られます。最初の行は正しいので、すべての地獄ブレークは失われます。WindowsからUnixにテキストファイルを変換する方法
int main()
{
bool windows = false;
char source[256];
char destination[256]; // Allocate the max amount of space for the filenames.
cout << "Please enter the name of the source file: ";
cin >> source;
ifstream fin(source, ios::binary);
if (!fin) // Check to make sure the source file exists.
{
cerr << "File " << source << " not found!";
getch();
return 1;
}//endif
cout << "Please enter the name of the destination file: ";
cin >> destination;
ifstream fest(destination);
if (fest) // Check to see if the destination file already exists.
{
cout << "The file " << destination << " already exists!" << endl;
cout << "If you would like to truncate the data, please enter 'Y', "
<< "otherwise enter 'N' to quit: ";
char answer = char(getch());
if (answer == 'n' || answer == 'N')
{
return 1;
}//endif
}//endif
clrscr(); // Clear screen for neatness.
ofstream fout(destination, ios::binary);
if (!fout.good()) // Check to see if the destination file can be edited.
{
cout << destination << "could not be opened!" << endl;
getch();
return 1;
}//endif
// Open the destination file in binary mode.
fout.open(destination, ios::binary);
char ch = fin.get(); // Set ch to the first char in the source file.
while (!fin.eof())
{
if (ch == '\x0D') // If ch is a carriage return, then the source file
{ // must be in a windows format.
windows = true;
}//endif
if (windows == true)
{
ch = fin.get(); // Advance ch, so that at the bottom of the loop, the
}//endif // carriage return is not coppied into the new file.
if (windows == false)
{
if (ch == '\x0A') // If the file is in the Unix format..
{
fout.put('\x0D'); // When a new line is found, output a carriage
}//endif // return.
}//endif
fout.put(ch);
ch = fin.get();
}//endwh
if (windows == true)
{
fout.put('\x0A');
}//endif
fout.close();
fin.close(); // Close yer files.
if (windows == true) // A little output for user-friendly-ness.
{
cout << "The contents of " << source << " have been coppied to "
<< destination << " and converted to Unix format." << endl;
}else{
cout << "The contents of " << source << " have been coppied to "
<< destination << " and converted to Windows format." << endl;
}//endif
cout << "Enter any key to quit.." << endl;
getch();
return 0;
}//endmn
だから、どうしたらいいですか? –
スクリプトを使用できる場合は、linux/unixプラットフォームでdos2unixを使用することもできます。 – weima
この場合はあなたの問題だとは思えませんが、本当に 'fest 'を呼び出すべきです。close() 'を実行して宛先ファイルの入力ストリームを閉じてから出力ストリームとして開くこともできます。 –