2013-02-28 2 views
1

Я создал некоторые .txt-файлы на моем Mac (не думал, что это было бы важно сначала, но ...), чтобы я мог прочитать их в приложении, которое я делаю (к сожалению) Visual Studio на другом компьютере. Они в основном файлы заполнены записями, с количеством записей в строке в верхней части, например:Проблемы с getline/чтением файлов в Windows

2 
int int 
age name 
9 Bob 
34 Mary 
12 Jim 
... 

В коде, который я первоначально только сделал (и успешно испытан) на Mac, я пытаюсь читать этот файл и аналогичные:

Table TableFromFile(string _filename){ //For a database system 

    ifstream infile; 
    infile.open(_filename.c_str()); 

    if(!infile){ 
    cerr << "File " << _filename << " could not be opened."; 
    exit(1); 
    } 

    //Determine number attributes (columns) in table, 
    //which is number on first line of input file 
    std::string num; 
    getline(infile, num); 
    int numEntries = atoi(num.c_str()); 
    ... 
    ... 

Короче говоря, это вызывает сбой! Когда я заглянул в нее, я нашел несколько интересных ошибок «Ошибка чтения символов» и обнаружил, что numEntries получает какую-то сумасшедшую отрицательную ценность для мусора. Это, по-видимому, вызвано тем, что «num», которое должно быть просто «2», как видно из первой строки, на самом деле выходит как «ÿþ2».

Из небольшого исследования кажется, что эти странные символы форматируют вещи ... возможно, unicode/Mac специфический? В любом случае, это проблема, и мне интересно, есть ли быстрый и простой способ сделать текстовые файлы, созданные мной на моем Mac, сотрудничать и вести себя в Windows так же, как в терминале Mac. Я попытался подключиться к машине UNIX, поместив там txt-файл, запустив на нем unix2dos и вернувшись в VS, но безрезультатно ... все же эти символы в начале строки! Должен ли я просто делать свои входные файлы снова в Windows? Я очень удивлен, узнав, что то, что вы видите, это не всегда то, что вы получаете, когда речь идет о персонажах в файле на разных платформах ... но хороший урок, я полагаю.

+1

байты в начале файла являются Unicode [Byte Order Mark] (http://en.wikipedia.org/wiki/Byte_order_mark), указывая, что текстовый файл закодирован в UTF-16 (LE). Как вы создали текстовый файл? С текстовым редактором? Вам нужны возможности Unicode в вашем проекте? – nwellnhof

ответ

2

Как указал комментатор, байты, которые вы видите, являются значком порядка байтов. См. http://en.wikipedia.org/wiki/Byte_order_mark.

«ÿþ» - это 0xFFFE, обозначение порядка байтов UTF-16 «little endian». «2» - ваш первый фактический символ (для UTF-16 символы ниже 256 будут представлены байтами для 0xnn00 ;, где «nn» - обычный код ASCII или UTF-8 для этого символа, поэтому что-то пытается прочитайте байты, поскольку ASCII или UTF-8 будут делать OK, пока не достигнут первого нулевого байта).

Если вам нужно разобраться в деталях текстового файла в Юникоде, лучшим инструментом, о котором я знаю, является бесплатный редактор SC Unipad (www.unipad.org). Это только для Windows, но может читать и писать практически любую кодировку и сможет рассказать вам, что нужно знать о файле. Очень хорошо догадываться о кодировании.

UniPad сможет открыть файл и позволяет сохранить его в любой кодировки вы хотите: ASCII, UTF-8 и т.д.

Смежные вопросы