Вывод строки в файл - PullRequest
       1

Вывод строки в файл

3 голосов
/ 28 сентября 2011

Итак, я пытаюсь записать большую строку в файл .txt, но у меня возникли некоторые проблемы. Я хочу вывести следующую строку:

0.x.y.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.1.x.y.t.x.y.t.x.y.t.2.x.y.t.s.x.y.t.s.x.y.t.s.x.y.t.s.3.x.y.t.x.y.t.4.N.name.t.f.m.I.x.y.t.x.y.t.x.y.t.x.y.t.N.name.t.f.m.I.x.y.t.x.y.t.x.y.t.x.y.t.x.y.t.x.y.t.N.name.t.f.m.I.x.y.t.x.y.t.x.y.t.x.y.t.N.name.t.f.m.I.x.y.t.x.y.t.x.y.t.5.

(Это формат сохранения данных, не стоит его использовать).

Чтобы попытаться проверить это, я сначала написал это (где chunk - строка выше, созданная вне функции, которую я хочу вывести):

void WriteToFile(std::string chunk)
{
    cout << "Writing...\n";
    ofstream SaveGame;
    SaveGame.open("SaveGame.txt");
    std::string MainString = "0.x.y.t.f.t.f.t.f.t.f.";
    cout << MainString;
    SaveGame << MainString;
    cout << "Done!\n";
}

Этот тестовый код работает нормально, и мой выходной файл содержит 0.x.y.t.f.t.f.t.f.t.f.

Но когда я попробую это:

void WriteToFile(std::string chunk)
{
    cout << "Writing...\n";
    ofstream SaveGame;
    SaveGame.open("SaveGame.txt");
    std::string MainString = chunk;
    cout << MainString;
    SaveGame << MainString;
    cout << "Done!\n";
}

Я получаю тарабарщину:

⸰⹸⹹⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦ ⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦ ⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⹴⹦⸱⹸⹹⹴⹸⹹⹴⹸⹹⹴⸲⹸⹹⹴⹳⹸ ⹹⹴⹳⹸⹹⹴⹳⹸⹹⹴⹳⸳⹸⹹⹴⹸⹹⹴⸴⹎ 慮 敭 琮 昮 洮 䤮 砮 礮 琮 砮 礮 琮 砮 礮 琮 砮 礮 琮 丮 渮 浡 ⹥⹴⹦⹭⹉⹸⹹⹴⹸ ⹹⹴⹸⹹⹴⹸⹹⹴⹎ 慮 敭 琮 昮 洮 䤮 砮 礮 琮 砮 礮 琮 砮 礮 琮 砮 礮 琮 丮 渮 浡 ⹥⹴⹦⹭⹉⹸⹹⹴⹸⹹⹴⹸⹹⹴⹸⹹⹴⸵

Само собой разумеется, это не то, что я хочу.

Вот полный код программы; обратите внимание, что не удается использовать ли WriteToFile (Chunk) или WriteToFile (Total). Код также завершается ошибкой, если я инициализирую MainString как целую строку в WriteToFile.

#include <cstdlib>
#include <iostream>
#include <fstream>
#include <sstream>

using namespace std;

void ReadFile();
void WriteToFile(std::string chunk);

int main()
{
    ///CHUNK SAVE FORMAT
    std::string Chunk = "0.";
    Chunk += "x.y.";
    Chunk += "t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.";
    Chunk += "t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.";
    Chunk += "t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.";
    Chunk += "t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.";
    Chunk += "t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.";
    Chunk += "t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.";
    Chunk += "t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.";
    Chunk += "t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.";
    Chunk += "1.";
    Chunk += "x.y.t.";
    Chunk += "x.y.t.";
    Chunk += "x.y.t.";
    Chunk += "2.";
    Chunk += "x.y.t.s.";
    Chunk += "x.y.t.s.";
    Chunk += "x.y.t.s.";
    Chunk += "x.y.t.s.";
    Chunk += "3.";
    Chunk += "x.y.t.";
    Chunk += "x.y.t.";
    Chunk += "4.";
    Chunk += "N.name.t.f.m.I.x.y.t.x.y.t.x.y.t.x.y.t.";
    Chunk += "N.name.t.f.m.I.x.y.t.x.y.t.x.y.t.x.y.t.x.y.t.x.y.t.";
    Chunk += "N.name.t.f.m.I.x.y.t.x.y.t.x.y.t.x.y.t.";
    Chunk += "N.name.t.f.m.I.x.y.t.x.y.t.x.y.t.";
    Chunk += "5.";
    std::string Total = "0.x.y.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.t.f.1.x.y.t.x.y.t.x.y.t.2.x.y.t.s.x.y.t.s.x.y.t.s.x.y.t.s.3.x.y.t.x.y.t.4.N.name.t.f.m.I.x.y.t.x.y.t.x.y.t.x.y.t.N.name.t.f.m.I.x.y.t.x.y.t.x.y.t.x.y.t.x.y.t.x.y.t.N.name.t.f.m.I.x.y.t.x.y.t.x.y.t.x.y.t.N.name.t.f.m.I.x.y.t.x.y.t.x.y.t.5.";
    WriteToFile(Total);
    return 0;
}

void ReadFile()
{

}

void WriteToFile(std::string chunk)
{
    cout << "Writing...\n";
    ofstream SaveGame;
    SaveGame.open("SaveGame.txt");
    std::string MainString = chunk;
    cout << MainString;
    SaveGame << MainString;
    cout << "Done!\n";
}

Что здесь происходит?

Ответы [ 5 ]

4 голосов
/ 28 сентября 2011

«Тарабарщина» - это правильные данные, но они интерпретируются как 16-битные символы Юникода. Посмотрите на маленькие шестнадцатеричные числа в квадратах:

⸰ - 0x2E и 0x30 ('.' И '0')

Полагаю, вы пишете файл правильно, но каким-то образом проверяете записанные данные неправильно.

4 голосов
/ 28 сентября 2011

Даже не попробовав, я могу с уверенностью сказать, что это работает для меня.Ошибка не в коде, а в другом месте:

Я подозреваю, что вы открываете текстовый файл в Блокноте на Windows или аналогичной программе.Приложение попытается угадать кодировку файла и (ошибочно) предположить, что это файл в кодировке Unicode (UTF-16).

Чтобы исправить это, укажите кодировку при открытии файла (если Блокнот этого не делает.для поддержки этого используйте подходящий текстовый редактор, например Notepad ++).

2 голосов
/ 28 сентября 2011

Вы случайно не открыли файл с помощью блокнота?Если это так, блокнот использует некоторую эвристику ( IsTextUnicode ), чтобы угадать кодировку содержимого файла, если нет спецификации.В вашем случае именно этот контент заставляет его думать, что это на самом деле Unicode ...

Ваш код работает нормально.Это блокнот, который сломан.Подробнее о проблеме кодировки блокнота здесь .

0 голосов
/ 28 сентября 2011

Кажется, есть какая-то проблема в кодировании.Попробуйте открыть файл в редакторе, отличном от блокнота (wordpad или notepad ++), также вы получите правильный результат при чтении того же файла.

0 голосов
/ 28 сентября 2011

Код, который вы предоставляете, работает как задумано при компиляции с g ++ (Ubuntu / Linaro 4.5.2-8ubuntu4) Для диагностики вашей проблемы потребуется информация о вашей среде.

Чтобы уточнить, вызывает ли неправильный код некорректную работу терминала, а также при просмотре файла?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...