2013-08-01 5 views
-1

В настоящее время я работаю над парсером демо-файлов для игры, в которую я играю. Я смотрел на формат и приведенный пример, который находится в PHP (пытается преобразовать его в C#), но он использует fgetc, который из того, что я могу сказать, недоступен в C#, только C++. Любые идеи, как я могу обойти это? Я пробовал использовать StreamReader.Read(), но он не любит нулевые значения.fgetc alternative in C#

Пример может быть найден here, если кто-то хочет взглянуть на полный сценарий, чтобы лучше понять, чего я пытаюсь достичь.

Спасибо!

+2

Что вы имеете в виду, когда говорите «не нужны пустые значения»? – Kian

+0

Он выкинет исключение – user1522379

ответ

2

Чтобы прочитать этот файл, вы должны использовать BinaryReader. Чтобы прочитать int, вы можете позвонить ReadInt32. Для того, чтобы читать их строки, вам необходимо прочитать байт за байтом ReadByte и сравнить с 0.

using (var fs = File.OpenRead(filename)) 
{ 
    using (var reader = new BinaryReader(fs)) 
    { 
     // reading happens here 
    } 
} 

частная строка ReadString (BinaryReader читателя) { байт Ь; StringBuilder sb = new StringBuilder(); while ((b = reader.ReadByte())! = 0) { sb.Append ((char) b); } return sb.ToString(); }

Я ошибся при преобразовании кода. Формат файла говорит о том, что длина строки будет 260 символов. Таким образом, вы должны прочитать 260 байт, а затем обрезать строку, как это:

private string ReadString(BinaryReader reader, int length = 260) 
{ 
    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < length; ++i) 
    { 
     byte b = reader.ReadByte(); 
     sb.Append((char)b); 
    } 
    return sb.ToString().Trim(); 
} 

Чтобы прочитать заголовок, можно было бы написать:

string hldemo = ReadString(reader, 8); 

и читать имя хоста, например, будет:

string host = ReadString(reader); 

Это, скорее всего, точный дубликат PHP-кода, я думаю. См. Документ формата для других длин строк и посмотрите на их пример кода. Возможно, я что-то пропустил.

+0

Это отлично работает в первый раз, когда я его называю, в третий раз, когда я его называю, он ничего не возвращает, никаких идей, почему это может быть? - http://pastebin.com/kPDfv5Qi – user1522379

+0

@ user1522379: Вы говорите, что он не возвращается из вызова метода или не возвращает пустую строку? Вы просматривали данные, чтобы увидеть, есть ли пустая строка в этой позиции? –

+0

Он возвращает пустую строку, я использовал тот же файл в PHP-версии и вернул значения правильно! Вот пример файла (я сбил его на отдельные строки, чтобы вы могли видеть, сколько нулевых значений есть!) Http://gyazo.com/eb309812597cac046d6177bf3d73a3bd.png – user1522379