Форум программистов, компьютерный форум CyberForum.ru

Запись и чтение из файла wstring - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 17, средняя оценка - 5.00
Holsteng
 Аватар для Holsteng
47 / 10 / 3
Регистрация: 26.03.2012
Сообщений: 246
10.08.2012, 18:12     Запись и чтение из файла wstring #1
Всем привет! Ребята, работаю с Юникод и встал вопрос как считать из файла и записать в файл

C++
1
 wstring name;
Погуглив нашел вот что:

Запись в файл

C++
1
2
3
wstring &street
 
FileStreet.write ( street.c_str(), street.size() );
Чтение из файла у меня возникли проблемы. Когда пишу вот так

C++
1
FileStreet.read( namestreet.c_str(), namestreet.size() );
ошибка - невозможно преобразовать const wchar_t* в char*
Подскажите, как правильно.

И еще вопрос,где-то я слышал что если написать вот так
C++
1
reinterpret_cast<wchar _t*>
то считывание из файла будет идти по 2 байта, это правда?

Заранее спасибо!
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.08.2012, 18:12     Запись и чтение из файла wstring
Посмотрите здесь:

Запись и чтение из файла C++
Си, Запись и Чтение из файла. C++
Запись и чтение из файла C++
Запись и чтение из файла C++
Слишком медленное чтение wstring из файла C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
panicwassano
591 / 559 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
10.08.2012, 18:20     Запись и чтение из файла wstring #2
Цитата Сообщение от Holsteng Посмотреть сообщение
ошибка - невозможно преобразовать const wchar_t* в char*
простой string, да и зачем вы передаете в функцию указатель на константую строку???

C++
1
namestreet.c_str()// на выходе будет const char*
да и что такое FileStreet??? и где код
Holsteng
 Аватар для Holsteng
47 / 10 / 3
Регистрация: 26.03.2012
Сообщений: 246
10.08.2012, 18:23  [ТС]     Запись и чтение из файла wstring #3
Прошу извинить, забыл сказать что работаю с бинарными файлами

C++
1
2
3
4
5
6
7
8
9
wstring namestreet;
        fstream FileStreet ( "Streets.dat", ios::binary | ios::in);
        if(!FileStreet)
        {
            ErrorAddClient(L"Невозможно открыть файл \"Streets.dat\"");
            return false;
        }
        FileStreet.seekg( 0 );
        FileStreet.read( namestreet.c_str(), namestreet.size() );
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
10.08.2012, 20:34     Запись и чтение из файла wstring #4
Holsteng,
C++
1
FileStreet.read( namestreet.c_str(), namestreet.size() );
Первое - c_str() возвращает const wchar_t*.
Второе - изменение данных, на который указывает сей указатель (передать можно через const_cast) влечет за собой undefined behaviour.
Третье - вы считываете и записываете неправильно. Вам нужно записать сначала размер строки, затем саму строку. Для считывания, вам нужно считать размер, выделить память, считать, создать wstring и только так.
Четвертое - лучше юзать что-либо созданное для сериализации, boost::serialization или что-то типа.
Пятое - раз wstring то и юзайте std::wifstream/std::wofstream
Holsteng
 Аватар для Holsteng
47 / 10 / 3
Регистрация: 26.03.2012
Сообщений: 246
10.08.2012, 20:47  [ТС]     Запись и чтение из файла wstring #5
Всем спасибо! А ответьте, пжлста, еще по поводу

C++
1
2
3
4
5
6
И еще вопрос,где-то я слышал что если написать вот такКод C++
     
reinterpret_cast<wchar _t*>
 
 
 то считывание из файла будет идти по 2 байта, это правда?
Не пойму разницы между

C++
1
reinterpret_cast<wchar _t*>
и
C++
1
reinterpret_cast<char*>
при считывании и записью в файл
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
10.08.2012, 20:49     Запись и чтение из файла wstring #6
Holsteng, reinterpret_cast чего? Вообще reinterpret_cast делает преобразование, не заботясь о типах, а полагаясь на компетентность программиста, так что я ваш вопрос несколько не понял.
Holsteng
 Аватар для Holsteng
47 / 10 / 3
Регистрация: 26.03.2012
Сообщений: 246
10.08.2012, 20:49  [ТС]     Запись и чтение из файла wstring #7
Цитата Сообщение от ForEveR Посмотреть сообщение
Третье - вы считываете и записываете неправильно. Вам нужно записать сначала размер строки, затем саму строку. Для считывания, вам нужно считать размер, выделить память, считать, создать wstring и только так.
Непонятно, а можно пример.
panicwassano
591 / 559 / 20
Регистрация: 07.11.2010
Сообщений: 2,004
10.08.2012, 20:55     Запись и чтение из файла wstring #8
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// Copy a file
#include <fstream>
using namespace std;
 
int main () {
 
  char * buffer;
  long size;
 
  ifstream infile ("test.txt",ifstream::binary);
  ofstream outfile ("new.txt",ofstream::binary);
 
  // get size of file
  infile.seekg(0,ifstream::end);
  size=infile.tellg();// получаем размер
  infile.seekg(0);
 
  // выделяем память
  buffer = new char [size];
 
  // read content of infile
  infile.read (buffer,size);
 
  // write to outfile
  outfile.write (buffer,size);
  
  // release dynamically-allocated memory
  delete[] buffer;
 
  outfile.close();
  infile.close();
  return 0;
}
Holsteng
 Аватар для Holsteng
47 / 10 / 3
Регистрация: 26.03.2012
Сообщений: 246
10.08.2012, 20:57  [ТС]     Запись и чтение из файла wstring #9
Цитата Сообщение от ForEveR Посмотреть сообщение
Holsteng, reinterpret_cast чего? Вообще reinterpret_cast делает преобразование, не заботясь о типах, а полагаясь на компетентность программиста, так что я ваш вопрос несколько не понял.

Цитата Сообщение от ForEveR Посмотреть сообщение
Holsteng, reinterpret_cast чего? Вообще reinterpret_cast делает преобразование, не заботясь о типах, а полагаясь на компетентность программиста, так что я ваш вопрос несколько не понял.
Это не как не влиет на процесс считывании и записи в файл? То есть, при использовании ANSI используем
C++
1
reinterpret_cast<char *>
а при использовании Юникод
C++
1
reinterpret_cast<wchar _t*>
. Я Вас правильно понял?
И еще вопрос считывание/запись из файла идет же побайтно, независимо от кодировки?.

Добавлено через 2 минуты
Цитата Сообщение от panicwassano Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// Copy a file
#include <fstream>
using namespace std;
 
int main () {
 
  char * buffer;
  long size;
 
  ifstream infile ("test.txt",ifstream::binary);
  ofstream outfile ("new.txt",ofstream::binary);
 
  // get size of file
  infile.seekg(0,ifstream::end);
  size=infile.tellg();// получаем размер
  infile.seekg(0);
 
  // выделяем память
  buffer = new char [size];
 
  // read content of infile
  infile.read (buffer,size);
 
  // write to outfile
  outfile.write (buffer,size);
  
  // release dynamically-allocated memory
  delete[] buffer;
 
  outfile.close();
  infile.close();
  return 0;
}
Спасибо большое. Как считать в string Вы объяснили, а записать вот так

C++
1
2
3
wstring &street
 
FileStreet.write ( street.c_str(), street.size() )
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
10.08.2012, 21:02     Запись и чтение из файла wstring #10
Цитата Сообщение от Holsteng Посмотреть сообщение
Непонятно, а можно пример.
Да без проблем.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
int main()
{
    std::string s = "hello";
    std::ofstream ofs("file", std::ios::binary);
    size_t size = s.length();
    ofs.write(reinterpret_cast<char*>(&size), sizeof(size));
    ofs.write(s.c_str(), size + 1);
    ofs.close();
    std::ifstream ifs("file", std::ios::binary);
    ifs.read(reinterpret_cast<char*>(&size), sizeof(size));
    char* ptr = new char[size + 1];
    ifs.read(ptr, size + 1);
    ifs.close();
    std::string tmp(ptr);
    std::cout << tmp << std::endl;
    delete[] ptr;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.08.2012, 21:35     Запись и чтение из файла wstring
Еще ссылки по теме:

Запись и чтение из файла C++
Чтение и запись из файла C++
C++ Запись и чтение из файла

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Holsteng
 Аватар для Holsteng
47 / 10 / 3
Регистрация: 26.03.2012
Сообщений: 246
10.08.2012, 21:35  [ТС]     Запись и чтение из файла wstring #11
Вот спасибо, а то все ходил все вокруг да около. А как быть с Юникод, так же? Использовать
C++
1
wfstream
и
C++
1
reinterpret_cast<wchar _t*>
, а считывание также будет по байту?
Yandex
Объявления
10.08.2012, 21:35     Запись и чтение из файла wstring
Ответ Создать тему
Опции темы

Текущее время: 03:48. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru