использование const char * в массивах для чтения последовательных файлов - PullRequest
1 голос
/ 27 февраля 2012

извиняюсь, если это основной вопрос, но я не смог понять это из других постов. Я пытаюсь прочитать несколько изображений, помеченных "1.jpg" "2.jpg" "3.jpg" и т. Д. Я хотел бы сделать это, используя цикл for. Для чтения файлов (здесь я использую SOIL, как рекомендуется в учебном пособии по OpenGL, которому я следую) требуется const char* в качестве ввода имени файла.

char numbers[6] = "123456"; 

for (int i=0;i<6;i++)
{
   const char* filestring = new char[5];
   *filestring = numbers[i] + ".jpg";

   texture[i] = SOIL_load_OGL_texture(filestring, ...
   ...  // filestring should be const char* form
}

Ошибки:

(1) ошибка: строка инициализатора для массива символов слишком длинная [-fpermissive]

но я не вижу, что не так с char numbers[6] = "123456"?

ошибка: назначение места только для чтения '* filestring'

ошибка: неверное преобразование из 'const char *' в 'char' [-fpermissive]

Я немного сбит с толку. Буду благодарен за любой совет!

Спасибо.

Ответы [ 5 ]

3 голосов
/ 27 февраля 2012

Измените это:

char numbers[6] = "123456";

На это:

const char numbers[] = "123456";

Размер массива определяется автоматически компилятором, поэтому вам не нужно указывать его явно.Вы все равно пытаетесь установить его слишком маленьким, потому что он на самом деле имеет ширину 7 байт из-за завершающего нулевого терминатора .

Для него не обязательно быть const, ноесли вы все-таки пометите его как таковой, это станет более понятным.

Кроме того, это не сработает:

*filestring = numbers[i] + ".jpg";

Вы не можете объединять строки C таким образом.Проще всего было бы сделать это:

string filestring = string(1, numbers[i]) + ".jpg";

Когда вам нужно использовать ее как строку C, вы можете сделать это:

SOIL_load_OGL_texture(filestring.c_str(), ...
2 голосов
/ 27 февраля 2012

Я не вижу, что не так с char numbers[6] = "123456"

Напишите это так:

char numbers[6] = { '1', '2', '3', '4', '5', '6', 0 };

Это точно эквивалентно. Вы видите проблему сейчас?


numbers[i] + ".jpg"

Это не конкатенация строк. Фактически, поскольку numbers[i] == 0x31 + i (для i = от 0 до 5), это дает

&(".jpg"[49 + i])

, который является указателем на адрес с конца строкового литерала.

В C sprintf будет здесь полезно, но не забудьте оставить место для завершающего NUL. В C ++ используйте std::string.

Лучшая версия:

char filestring[] = "n.jpg";
for( int i = 0; i < 6; i++ ) {
    filestring[0] = '1' + i;
    texture[i] = //...
}
1 голос
/ 27 февраля 2012
std::string numbers [count] = { "1", "2", "3", ... }
for (int i = 0; i < count; ++i) {
  std::string filename = numbers[i] + ".jpg";
  texture[i] = SOIL_load_OGL_texture(filename, ...
  //or
  //texture[i] = SOIL_load_OGL_texture(filename.c_str(), ...
}
0 голосов
/ 27 февраля 2012

Использование потока ostring:

#include <sstream>
...
...
for (int i = 0; i < 6; i++)
{
  std::ostringstream ss;
  ss << i << ".jpg";

  texture[i] = SOIL_load_OGL_texture(ss.str().c_str(), ...
}
0 голосов
/ 27 февраля 2012

Было бы чище сделать это так:

for(int i = 0; i < 6; i ++)
{
    char filename[8];
    sprintf(filename, "%d.jpg", i + 1);
    texture[i] = SOIL_load_OGL_texture(filename, ... 
...