Объединить несколько символов

0

Я читаю файл, и я хотел бы извлечь все его содержимое и сохранить их в один символ в C++. Я знаю, что это можно сделать с помощью строк, но я не могу использовать строки и вам нужно прибегнуть к char. Я могу объединить несколько символов в одну переменную char?

Вот что я пробовал до сих пор:

 string str = "";
 ifstream file("c:/path.....");
 while (file.good())         
{
    str += file.get();       
}   
const char* content = str.c_str();
printf("%c", *content);

но это только что дало мне первую букву файла и это.

Если и попытался:

 ifstream file("c:/path.....");
 char c = ' ';
 char result[100];
 while (file.good())         
{
    c= file.get();  
            strcat(result,c);     
} 

но это все время давало мне ошибки времени выполнения.

  • 0
    Вы говорите о массиве символов?
  • 0
    Я только что отредактировал свой пост с описанием того, что я пробовал.
Показать ещё 1 комментарий
Теги:
file
concatenation
char

5 ответов

1
Лучший ответ

Для второй попытки, которую вы задали в своем вопросе (который, как я полагаю, из ваших других советов, это то, что вы, наконец, хотите), вы можете попробовать следующее как быстрое решение:

 ifstream file("c:/path.....");
 char c[2] = { 0, 0 };
 char result[100] = { 0 };
 for (int i = 0; file && (i < 99); ++i)         
 {
     c[0] = file.get();  
     strcat(result,c);     
 } 

Поскольку использование strcat() может быть не очень эффективным для этого strcat() использования, я думаю, что более эффективная реализация будет напрямую записываться в буфер result:

 ifstream file("c:/path.....");
 char result[100] = { 0 };
 for (int i = 0; file && (i < 99); ++i)         
 {
     result[i] = file.get();  
 } 
  • 0
    В этой ситуации strcat выглядит излишним, не так ли?
  • 0
    @Dabo Вот почему я упомянул, чтобы не использовать его ...
Показать ещё 2 комментария
1

Может быть, что-то вроде этого:

 char result[100];
 int i = 0;

 while (file.good())         
 {
    c= file.get();  
    if(i<100)
       result[i++]=c;
 }

  result[i]='\0';

В этом решении много чего улучшить (что бы вы сделали, если в вашем файле было больше 99 символов, file.good() не лучший вариант для состояния цикла и т.д.). Также гораздо лучше использовать строки. Я не знаю точно, почему вы не можете их использовать, но на всякий случай, когда вы передумаете, вы можете прочитать свой файл следующим образом:

std::string line;
while ( getline(stream, line)) {
  process(line);
}
1

В первом кодовом блоке:

const char* content = str.c_str();
printf("%c", *content);

печатает только первый символ строки, потому что *contents разделяет указатель на (первый символ) строки, а %c - формат printf для одного символа. Вы должны заменить это на

printf("%s", content);

для печати всей строки. Или просто используйте

std::cout << str;
  • 0
    ОК, я не знал, что он разыменовывает указатель на первый символ строки. Хорошо, но скажите, что я не хочу распечатывать его, а просто сохранить его (как я и сказал, предпочтительно в переменной char), как я могу это сделать?
  • 0
    @Morelka: переменная char содержит один символ. Вы имеете в виду массив char ?
Показать ещё 2 комментария
0

Вы можете создать std::string своих персонажей и объединить их:

char c1 = 'a';
char c2 = 'b';
std::string concatted = std::string(1, c1) + std::string(1, c2);

Это работает из-за заполнения std::string constructor, см. Ссылку.

  • 0
    Из вопроса ОП: «... однако я не могу использовать строки ...»
  • 0
    @ πάνταῥεῖ Для меня неясно, к чему это относится. Я полагаю, это относится к входам . В моем примере c1 и c2 не являются строками.
Показать ещё 3 комментария
-1

Очевидно, вы новичок в c++ или, по крайней мере, используете какую-то странную терминологию.

Прежде всего, я советую вам прочитать литературу c++ для новичков (вы можете найти ее список в stackoverflow). Тогда вы поймете все концепции струн в c++.

Во-вторых, используйте этот код для чтения содержимого файла и сохранения его в символе char *.

FILE *f = fopen("path to file", "r");
fseek(f, 0, SEEK_END);
long fsize = ftell(f);
fseek(f, 0, SEEK_SET);

char *content = new char[fsize + 1];
fread(content, fsize, 1, f);
fclose(f);

content[fsize] = 0;

cout << "{" << content <<"}";

delete content;
  • 0
    ОП сказал, что он не может использовать строки ... Не уверен, что ваш ответ действительно отвечает на вопрос, однако я не совсем уверен, что именно ОП имеет в виду.
  • 0
    ОП запрашивает единичные значения char , а не массивы char[] !
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню