Массив из текстового файла - не работает - PullRequest
0 голосов
/ 05 ноября 2011

Я пытаюсь создать массив с данными, поступающими из текстового файла.Затем я пытаюсь подсчитать, сколько частей данных в этом массиве.В массиве есть две части данных, однако, когда счетчик работает, он говорит, что есть только 1.

Вот мой код:

#include <iostream>
#include <fstream>
#include <string>
using namespace std;
int main()
{
   int n = 0;
   ifstream show_version_library;
   show_version_library.open("version_library.txt");
   char show_version_library_var[1024];
   if (show_version_library.is_open())
   {
       while (!show_version_library.eof())
       {
          show_version_library >> show_version_library_var;
       }
   }

   // string replace * to ,
   string show_version_library_actual( show_version_library_var );
   int position = show_version_library_actual.find( "*" ); // find first space
   while ( position != string::npos ) 
   {
       show_version_library_actual.replace( position, 1, "," );
       position = show_version_library_actual.find( "*", position + 1 );
   }  

   // string replace ^ to "
   string show_version_library_actual2( show_version_library_actual );
   int position2 = show_version_library_actual2.find( "^" ); // find first space
   while ( position2 != string::npos ) 
   {
       show_version_library_actual2.replace( position, 1, "\"" );
       position2 = show_version_library_actual2.find( "^", position2 + 1 );
   } 

   // convert show_version_library_actual2 to char*  
   char* lib2;
   lib2 = &show_version_library_actual2[0];

   // array counter
   char* library_actual[100] = {
                               lib2
                               };

   char* p;
   while (p != '\0')
   {
       n++;
       p = library_actual[n];
   }

   cout << "\nN is " << n << " that was n\n"; // should be outputting 2
   show_version_library.close();

   system("PAUSE");
   return 0;
}

(код был переформатирован такчто он будет отображаться здесь как код)

И в файле version_library.txt

"1.8_HACK"*"1.8"*

Я попытался вывести "lib2", и получилось

"1.8_HACK", "1.8", 

... как следует ...

Однако, когда я вывожу library_actual[0], появляется целая строка, а не просто "1.8_HACK".

Я довольно новичок в cpp, поэтому, пожалуйста, извините за мой ужасный код ... если таковой есть.

Спасибо!

1 Ответ

1 голос
/ 05 ноября 2011

Я думаю, что с этого раздела что-то не так:

   // convert show_version_library_actual2 to char*   
   char* lib2; 
   lib2 = &show_version_library_actual2[0]; 

Это ничего не конвертирует. Он объявляет указатель на символ lib2 и устанавливает его значение в качестве адреса первого символа в массиве show_version_library_actual2 char. В этом нет ничего плохого, но конверсия не происходит.

Последовательность:

   // array counter 
   char* library_actual[100] = { 
                               lib2 
                               }; 

ничего не считает. Он устанавливает массив из 100 указателей на символ. Вы инициализируете его только с 1 значением - указателем на первый символ в массиве символов show_version_library_actual2. Остальные 99 значений в массиве неинициализированы.

Следующий цикл:

   char* p; 
   while (p != '\0') 
   { 
       n++; 
       p = library_actual[n]; 
   } 

, вероятно, не то, что вы намеревались, поскольку он имеет дело с в основном неинициализированным массивом. Он возвращает 1, но только потому, что library_actual [0] (lib2 = первый символ массива show_version_library_actual2) не равен нулю, поэтому цикл заканчивается.

Я не уверен, как именно вы намеревались идентифицировать фрагменты данных. Возможно, вы подумали, что, добавив запятые, вы получите отдельные строки. Если это то, что вы хотели, вы должны помнить, что в C / C ++ ничего подобного не произойдет само по себе. Назначения, как правило, просто так - никакого преобразования не произойдет, как это может произойти во многих других языках.

Если вам нужно получить отдельные строки, вам нужно это сделать. Если вы просто хотите посчитать, сколько раз встречается запятая, это довольно просто. Например, вы можете сделать:

char *p = lib2;
int n = 0;
while(*p != '\0')
{
    if(*p == ',')
        ++n;
}

При этом n будет представлять число запятых. В вашем примере это даст вам 2. Я оставлю это вам в качестве упражнения для случая, когда есть 2 элемента, но разделенные 1 запятой. Подсказка: иногда полезно добавить начальный или конечный разделитель для обеспечения согласованности обработки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...