Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
1 / 1 / 1
Регистрация: 23.05.2017
Сообщений: 15
1

Char[] vs string

23.07.2017, 19:25. Показов 1026. Ответов 13
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!
Столкнулся с такой странной для меня проблемой.
Если читать простой текстовый файл то оба варианта рабочие,
но если читать png или pdf файл то в варианте со стрингом получается битый файл
Просветите что тут происходит, и как можно вариант со стрингом поправить
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
#include <iostream>
#include <fstream>
 
 
int main(int argc, char* argv[]) {
    if (argc != 2) {
        std::cout << "ERROR: need filename!" << std::endl;
        return 1;
    }
    std::string filename = argv[1];
    std::ifstream ifile(filename, std::ios::binary);
    std::ofstream ofile("test_"+filename, std::ios::binary);
 
    while(!ifile.eof()) {
        const int size = 5;
        char buf[size];
        memset(buf, 0, size);
        ifile.read(buf, size-1);
        
        std::string str(buf);
        
        if (strcmp(buf, str.c_str()) != 0) {
            //сюда никогда не заходим
        }
        //ofile.write(str.c_str(), size-1); //1) получаем битый файл
        ofile.write(buf, size-1); //2) получаем полную копию
    }
 
    ifile.close();
    ofile.close();
}
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
23.07.2017, 19:25
Ответы с готовыми решениями:

есть массив char. есть строка string. как присвоить значению string-a значение char-a?
есть массив char. есть строка string. как присвоить значению string-a значение char-a?

Передача в функцию char*([Warning] deprecated conversion from string constant to 'char*' [-Wwrite-strings])
Почему компилятор на это матерится? ObjA.Show(&quot;A&quot;); deprecated conversion from string constant...

Строка: чем отличается строки string, char, char*?
Помогите разобраться,совсем плохо идёт,чем отличается строки string,char,char* И если можно пару...

Как преобразовать char* в string и вывести переменную string на экран?
for (int k = 0; k &lt; 10; k++) { int x = (int)rand() / RAND_MAX + rand() % 6 + 2; ...

13
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
23.07.2017, 19:39 2
полный вариант со строкой покажите.
0
1 / 1 / 1
Регистрация: 23.05.2017
Сообщений: 15
23.07.2017, 19:44  [ТС] 3
Цитата Сообщение от GbaLog- Посмотреть сообщение
полный вариант со строкой покажите.
нужно раскоментировать
Код
//ofile.write(str.c_str(), size-1); //1) получаем битый файл
и закоментировать
Код
ofile.write(buf, size-1); //2) получаем полную копию
if я написал только для проверки, там внутри у меня cout.
Тоесть это полный код.
в параметр просто передать имя файла, картинки например
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
23.07.2017, 19:49 4
Лучший ответ Сообщение было отмечено maxmail как решение

Решение

maxmail, как минимум вы интепретируете бинарный файл как "С-строку" (null-terminated string) в конструкторе std::string и strcmp, поэтому всё сломается на первом 0 или его отсутствии.

Добавлено через 1 минуту
string c "нулями" можно создать другим конструктором, где 2-м аргументом идёт размер.
2
1 / 1 / 1
Регистрация: 23.05.2017
Сообщений: 15
23.07.2017, 19:52  [ТС] 5
Цитата Сообщение от gray_fox Посмотреть сообщение
ы интепретируете бинарный файл как "С-строку"
есть возможность используя стринг, как то считать бинарный файл и записать? или стринг в данном случае не подходит совсем?
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
23.07.2017, 19:53 6
strcmp по нормальному со бинарными данными работать не будет никак.

Добавлено через 1 минуту
Цитата Сообщение от maxmail Посмотреть сообщение
есть возможность используя стринг, как то считать бинарный файл и записать? или стринг в данном случае не подходит совсем?
Можно. Я уже написал, как можно сконструировать объект. Потом не используйте функции для работы с С-строками (string::c_str, strcmp и т.д.).
1
1 / 1 / 1
Регистрация: 23.05.2017
Сообщений: 15
23.07.2017, 19:58  [ТС] 7
Цитата Сообщение от gray_fox Посмотреть сообщение
Потом не используйте функции для работы с С-строками (string::c_str, strcmp и т.д.).
а как потом достать из стринга массив байт, если нельзя использовать с_str() ?
0
Любитель чаепитий
3742 / 1798 / 566
Регистрация: 24.08.2014
Сообщений: 6,016
Записей в блоге: 1
23.07.2017, 20:00 8
C++
1
2
3
4
#include <algorithm>
//...
std::string str;
std::copy(buf, buf + size, std::back_inserter(str));
1
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
23.07.2017, 20:02 9
Цитата Сообщение от maxmail Посмотреть сообщение
а как потом достать из стринга массив байт, если нельзя использовать с_str() ?
std::string::data
1
1 / 1 / 1
Регистрация: 23.05.2017
Сообщений: 15
23.07.2017, 20:03  [ТС] 10
всем спасибо огромное, решил свою проблему на этапе конструирования стринга с 2 параметрами!
0
What a waste!
1608 / 1300 / 180
Регистрация: 21.04.2012
Сообщений: 2,729
23.07.2017, 20:04 11
GbaLog-, там вроде есть конструктор
C++
1
std::string str(buf, size);
0
GbaLog-
23.07.2017, 20:08
  #12

Не по теме:

Цитата Сообщение от gray_fox Посмотреть сообщение
там вроде есть конструктор
да я даже лайк вам там поставил, чего вы? :)

0
gray_fox
23.07.2017, 20:11
  #13

Не по теме:

Цитата Сообщение от GbaLog- Посмотреть сообщение
да я даже лайк вам там поставил, чего вы?
Зачем тогда воротить std::copy, если есть конструктор? Я просто решил, что ты не в курсе, вот и всё :)

0
GbaLog-
23.07.2017, 20:19     Char[] vs string
  #14

Не по теме:

Цитата Сообщение от gray_fox Посмотреть сообщение
Зачем тогда воротить std::copy, если есть конструктор?
я когда писал, там этого ещё не было всего. :)

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.07.2017, 20:19

Где и почему используют ту или иную строку std::string, char[], System::String^ ?
Где и почему используют ту или иную строку std::string, char, System::String^ ? Объясните...

String, AnsiString или char * ? Что лучше использовать с классами? И как работать с типом string
Добрый вечер. Мне нужно в одну строку str1 поместить строку str2. Обе они типа string. В интернете...

char char* string и константные значения
Робот может перемещаться в 4 направлениях c-Север, u- Юг, z- Запад, v- Восток ипринемать 3 цифровые...

ошибка в программе (cannot convert 'std::string {aka std::basic_string<char>}' to 'const char*')
int main() { string fileName, currWord, currMax = &quot;&quot;; cin&gt;&gt;fileName; ...


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru