こんにちは、これは少し初心者に見えるかもしれませんが、ここに行きます。インターネットから特定のゲームのリーダーボードをダウンロードし、それを適切な形式 (精巧なランキングなど) に変換するプログラムを開発しています。
ファイルにはランク順に並べられた名前が含まれていますが、各名前の間には 7 つのランダムな制御コードがあります(明らかに印刷できません)。txt ファイルは次のようになります。
..C...hName1..)...&Name2......)Name3..é...þName4..Ü...†Name5..'...QName6..~... bName7..H...NName8..|....Name9..v...HName10.
hexEditor で確認したところ、各名前の後の最初の制御コードは常に null 文字 ( 0x00 ) でした。だから、私はすべてを読んでから、すべての文字を数えます。0x00 文字が見つかった場合は、7文字をスキップして数え続けます。したがって、あなたはリストで終わりますよね?
最初は、これらのランダムな制御コードで、「ソフト EOF」( 0x1A )のようなものを見つけることがあり、プログラムがそこで読み取りを停止するという問題がありました。それで、最終的にバイナリモードで開くことにしました。それは機能し、その後、すべてがカウントされます...またはそれが私が思ったことです。
しかし、まだ機能しない別のファイルに出くわし、最終的にEOF文字があることがわかりました! ( 0x0A ) バイナリ モードで開いているので意味がありません。それでも、その文字を読み取った後、C++ はそれを新しいファイルとして解釈するため、7 文字をスキップするため、その文字の後の名前は常にカットされて表示されます。
これが私の現在のコードです:
#include <cstdlib>
#include <iostream>
#include <fstream>
using namespace std;
int main () {
string scores;
system("wget http://certainwebsite/001.txt"); //download file
ifstream highin ("001.txt", ios::binary);
ofstream highout ("board.txt", ios::binary);
if (highin.is_open())
{
while ( highin.good() )
{
getline (highin, scores);
for (int i=0;i<scores.length(); i++)
{
if (scores[i]==0x00){
i=i+7; //skip 7 characters if 'null' is found
cout << endl;
highout << endl;
}
cout << scores[i];
highout << scores[i]; //cout names and save them in output file
}
}
highin.close();
}
else cout << "Unable to open file";
system("pause>nul");
}
既にバイナリ モードになっている場合、その文字を無視する方法がわかりません。長い質問で申し訳ありませんが、詳細かつ具体的にしたかったのです。この場合、EOF 文字は Name3 の前にあるため、出力は次のようになります: http://i.imgur.com/yu1NjoZ.png