C ++ Чтение / запись в текстовый файл - PullRequest
0 голосов
/ 14 апреля 2011

Мне нужно написать цифры и текст в текстовом файле, по неизвестной причине, запись работает, чтение не, проблема чтения текста, как в следующем примере:

fstream ff,ff2;
int a,b;
ff.open("simtestagain.txt",ios::out);
CString mycstring = _T("Name with spaces");
char mycharbuffer[255];         //destination buffer
size_t convertedChars = 0;      //number of characters converted
wcstombs_s( &convertedChars, mycharbuffer, mycstring.GetLength()+1,mycstring.GetBuffer(), _TRUNCATE);
ff << 1 << endl;
ff << mycharbuffer << endl; 
ff << 2 << endl;

ff.close();

ff2.open("simtestagain.txt",ios::in);

ff2 >> a;
ff2.getline(mycharbuffer,255);
mycstring = mycharbuffer;
ff2 >> b;

ff2.close();
AfxMessageBox(mycstring);

Значение в порядке, строка CString остается пустой ...

Ответы [ 2 ]

1 голос
/ 14 апреля 2011

Оператор извлечения не использует пробелы, поэтому getline просто читает пробелы, оставшиеся в первой строке.Попробуйте добавить это до звонка на getline:

ff2.ignore(255, '\n');
0 голосов
/ 14 апреля 2011

Ваша основная проблема заключается в том, что когда вы читаете строку, \n в конце первой строки все еще находится во входном буфере. Поскольку getline просто читает до следующего \n во входном буфере, вы получаете пустую строку.

ИМО, тебе бы лучше было делать все по-другому. Начнем с того, что вместо явного преобразования с wcstombs_s лучше использовать wofstream, который автоматически выполнит преобразование. Вы также должны обычно использовать [w]ifstream и [w]ofstream, если вы не собираетесь читать и писать через один и тот же поток:

#include <fstream>
#include <string>
#include <windows.h>

int main() { 
    char name[] = "simtestagain.txt";
    std::wofstream ff(name);
    std::wstring my_string(L"Name with spaces");

    // avoid unnecessary flushes by using "\n" instead of std::endl;
    ff << 1 << "\n" << my_string << "\n" << 2 << "\n";

    ff.close();

    std::ifstream ff2(name);
    int a,b;
    char ignore;
    std::string my_second_string;

    ff2 >> a >> std::noskipws >> ignore;
    std::getline(ff2, my_second_string);
    ff2 >> b;

    MessageBox(NULL, my_second_string.c_str(), "", MB_OK);
    return 0;
}

Обратите внимание, однако, что это зависит от того факта, что строка, которую вы записали в файл как многобайтовые символы, действительно все закодированы как однобайтовые символы, так что то, что вы пишете из std::wstring, будет читаться чисто как std::string. В этом случае это правильно, но в общем случае это не будет. Единственный раз, когда это работает, это когда все содержимое в основном было простым ASCII (так что, по сути, не было причин играть с широкими символами, преобразованиями и т. Д.)

Если вы хотите поддерживать широкие символы, то, что вы пишете как широкие символы, вы должны читать обратно как широкие символы. Это также немного упрощает обработку файлов - вы можете читать и записывать данные в одном потоке:

#include <fstream>
#include <string>
#include <windows.h>

int main(){ 
    char name[] = "simtestagain.txt";
    std::wfstream ff(name);
    std::wstring my_string(L"Name with spaces");

    ff << 1 << "\n" << my_string << "\n" << 2 << "\n";

    ff.seekg(0);

    int a,b;
    wchar_t ignore;
    std::wstring my_second_string;

    ff >> a >> std::noskipws >> ignore;
    std::getline(ff, my_second_string);
    ff >> b;

    MessageBoxW(NULL, my_second_string.c_str(), L"", MB_OK);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...