У меня в основном есть txt
файл, который выглядит так...
High Score: 50
Player Name: Sam
Number Of Kills: 5
Map
Time
Я хочу сохранить все до :
или пробела после Map
и Time
в один массив и все после другого. Как для Map
и для Time
, после этого нет ничего, поэтому я хочу сохранить пробел как null
.
До сих пор мне удалось прочитать и сохранить всю эту информацию в массиве temp
. Тем не менее, это отделяет меня от проблем. Это мой код:
istream operator >> (istream &is, Player &player)
{
char **temp;
char **tempNew;
char lineInfo[200]
temp = new char*[5];
tempNew = new char*[5];
for (int i=0; i<5; i++)
{
temp[i] = new char[200];
is.getline(lineInfo, sizeof(lineInfo));
int length = strlen(lineInfo);
for (int z=0; z < length; z++)
{
if(lineInfo[z] == '= ' ){ //HOW DO I CHECK IF THERE IS NOTHING AFTER THE LAST CHAR
lineInfo [length - (z+1)] = lineInfo [length];
cout << lineInfo << endl;
strncpy(temp[i], lineInfo, sizeof(lineInfo));
}
else{
tempNew[i] = new char[200];
strncpy(tempNew[i], lineInfo, sizeof(lineInfo));
}
}
}
Если вам нужно найти ":"
#include <cstring>
и просто auto occurance = strstr(string, substring);
Документация здесь.
если occension не является нулевым ptr, то посмотрите, находится ли в конце строки строка get get. Если нет, то ваше значение будет после этого:
map
нет двоеточия, но я хочу сохранить все после map
как null
. Был бы очень признателен, если бы вы могли помочь изменить мой код
Гораздо проще с std::string
.
// Read high score
int high_score;
my_text_file.ignore(10000, ':');
cin >> high_score;
// Read player name
std::string player_name;
my_text_file.ignore(10000, ':');
std::getline(my_text_file, player_name);
// Remove spaces at beginning of string
std::string::size_type end_position;
end_position = player_name.find_first_not_of(" \t");
if (end_position != std::string::npos)
{
player_name.erase(0, end_position - 1);
}
// Read kills
unsigned int number_of_kills = 0;
my_text_file.ignore(':');
cin >> number_of_kills;
// Read "Map" line
my_text_file.ignore(10000, '\n');
std::string map_line_text;
std::getline(my_text_file, map_line_text);
// Read "Text" line
std::string text_line;
std::getline(my_text_file, text_line);
Если вы настаиваете на использовании строк стиля C (массивы char
), вам придется использовать более сложные и менее безопасные функции. Найдите следующие функции:
fscanf, strchr, strcpy, sscanf
c style
, как я могу заставить его делать то, что вы делали со string
?
new
но вы никогда неdelete []
, что приведет к утечке памяти. Вместо этого используйтеstd::string
иstd::vector
чтобы вам не нужно было выделять память напрямую (и тогда вам также не нужно использовать строковые функции C).