Я пытаюсь выполнить некоторые строковые манипуляции из файла.gz. и я написал следующий код.
char buffer[1001];
for(;gzeof(f_Handle);){
gzread(f_Handle, buffer, 1000);
buffer[1000] = 0;
char* chars_array = strtok(buffer, " ");
while(chars_array){
cout<<chars_array << '\n';
chars_array = strtok(NULL, " ");
}
}
Однако формат файла (.gz) находится в
A 1 2 3
B 2 3 5
A 4 5 6
B 34 64 123
и я хочу знать, когда это A или B и содержимое в или B отдельно.
в настоящее время он печатает его в followng манере
A
1
2
3
...
Идея а) заключается в использовании цикла if через chars_array для определения A или B или
b) строковый массив вместо указателя char
Вот простой пример использования std::string
и функции substr(...)
Он не будет обрабатывать всю строку, но вы можете поместить ее в цикл для этого.
#include <string>
#include <iostream>
#include <vector>
int main()
{
std::string original = "01234567 89abc defghi j";
std::vector< std::string > strings;
// Find space from last index
int lastSpaceIndex = 0;
int spaceIndex = original.find( ' ', lastSpaceIndex );
// Find the number of characters to split
int numCharacters = spaceIndex - lastSpaceIndex;
// Split string ( the second argument is the number of characters to splut out)
std::string tokenizedString = original.substr( lastSpaceIndex, numCharacters );
// Add to vector of strings
strings.push_back( tokenizedString);
// Print result
std::cout << "Space at : " << spaceIndex << std::endl;
std::cout << "Tokenized string : " << tokenizedString << std::endl;
// Find the nextsubstring
// =========================================================================
// Need to increase by 1 since we don't want the space
lastSpaceIndex = spaceIndex + 1;
spaceIndex = original.find( ' ', lastSpaceIndex );
numCharacters = spaceIndex - lastSpaceIndex;
tokenizedString = original.substr( lastSpaceIndex, numCharacters );
strings.push_back( tokenizedString);
std::cout << "Space at : " << spaceIndex << std::endl;
std::cout << "Tokenized string : " << tokenizedString << std::endl;
std::cout << "=====================================\n";
for ( const auto &str : strings )
{
std::cout << "String : " << str << std::endl;
}
}
Вывод:
Space at : 8
Tokenized string : 01234567
Space at : 14
Tokenized string : 89abc
=====================================
String : 01234567
String : 89abc
Когда больше нет пробелов, original.find( ' ', lastSpaceIndex )
вернет std::npos
std::string
?