Я новичок в C ++, и у меня проблема с моей программой. Я искал часы и дни, и хотя есть много постов, похожих на этот, я не могу понять, почему моя программа не работает.
У меня есть файл, который содержит данные таким образом.
STRING FLOAT FLOAT
STRING INT
STRING FLOAT FLOAT FLOAT
STRING INT INT
FLOAT
FLOAT
…
Таким образом, первые несколько строк содержат строку для первого столбца и номер для остальных, а в какой-то момент есть просто число с плавающей точкой.
Мне удалось получить данные там, где начинаются все числа с плавающей точкой, но я не могу понять, как сохранить оставшуюся часть числа в массиве. (Я ЗНАЮ, ЧТО ЭТО БЫЛО БОЛЕЕ ЛЕГКО, ЧТОБЫ СДЕЛАТЬ ЭТО С ВЕКТОРОМ, НО Я ДОЛЖЕН СДЕЛАТЬ ЭТО С Массивами)
Это то, что я сделал.
void getData(string *ext, int size)
{
istringstream is(*ext);
float val;
is >> val;
float *arrVal = new float[10]; // I dont know the size of the Array.
if(typeid(val) == typeid(float)) //IM NOT SURE ABOUT THIS AT ALL. I JUST DON'T KNOW HOW TO GET TO THE LINE WHERE THERE ARE NO STRINGS
{
arr[size] = atof(*ext.c_str());
} // I think this part is why it does not work.
int main()
{
ifstream File("t.txt");
string line;
int nLines(0);
float *arrayValues = new float[12];if(!inFile)
{
cerr << "Cannot open file." << endl;
return -1;
}
else
{
while(getline(File, line))
{
getValues(&line, nLines);
getPoints(&line); //this function gets the values of the first lines.
++nLines;
}
}
system("pause");
return 0;
}
В общем, я должен выяснить, как перейти к строке, с которой начинаются все типы с плавающей точкой, и как сохранить их в массиве.
Я уверен, что есть куча ошибок. Я надеюсь, что вы, ребята, получите то, что я пытаюсь сделать. Я действительно везде искал и ничего не могу найти.
Спасибо !!
Когда вы читаете каждый файл, вы получаете данные в виде символа. Так,
— Токенизируйте каждую строку, прочитанную пробелами, используя strtok. Эта логика не работает, если между строкой есть пробелы. Это прекрасно работает, если в вашей строке только одно слово типа «STRRING» или «FLOAT». Это не работает, если ваша строка похожа на «Я гений» 🙂
— Проверяйте каждый токен просто, если условие должно выполнять вашу работу. строки начинаются с [a-z] или [A-Z]. Числа используют [0-9].
-Как только валидиал. выполнить необходимые преобразования, используя atoi или itoa, или другие.
Этот скелет пропустит любую строку в файле, которая не является числом с плавающей запятой.
bool isFloat(string s)
{
bool result = true;
bool decimalSeen = false;
for(int i = 0; i < s.length(); ++i)
{
if(s[i] == '.')
{
if(!decimalSeen)
{
decimalSeen = true;
}
else
{
result = false;
break;
}
}
else if(s[i] >= '0' && s[i] <= '9')
{
continue;
}
else
{
result = false;
break;
}
}
return result;
}
int main()
{
ifstream File("t.txt");
string line;
if(!File.is_open())
{
cerr << "Cannot open file." << endl;
return -1;
}
else
{
while(getline(File, line))
{
if(isFloat(line))
{
float val = atof(line.c_str());
// Now add to array
}
}
}
system("pause");
return 0;
}
Если вы хотите использовать массив, вам нужно будет создать новый больший массив и скопировать значения. Главная идея:
int maxSize = 10;
float* a = new float[maxSize];
// use a until it is full then
float* b = new float[maxSize*2];
memcpy(b, a, sizeof(float)*maxSize);
maxSize *= 2;
float* temp = a;
// make a point to new array
a = b;
// free memory a was using before
delete[] temp;