Привет, это может показаться немного новичком, но поехали. Я разрабатываю программу, которая загружает таблицы лидеров определенной игры из Интернета и преобразует их в подходящий формат для работы с ней (разрабатывает рейтинги и т. д.).
Файлы содержат имена, упорядоченные по рангу, но между каждым именем есть 7 случайных контрольных кодов (явно непечатаемых). Текстовый файл выглядит так:
..C...hName1..)...&Name2......)Name3..é...þName4..Ü...†Name5..'...QName6..~... bName7..H...NName8..|....Name9..v...HName10.
Проверил через hexEditor и увидел, что первый управляющий код после каждого имени всегда нулевой символ (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
getline()
распознает его как маркер конца строки. Если вы не хотите специально обрабатывать символы '\n',getline
, вероятно, не подходит для использования. - person Keith Thompson   schedule 26.05.2013