Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.12.2019, 23:30   #11
archerix
Форумчанин
 
Регистрация: 13.09.2019
Сообщений: 119
По умолчанию

Просто интересно - может, у списка в данном случае какое-то преимущество, которого я не понял из чтения литературы Мне показалось, что именно вектор и придуман как массив переменного размера.
Насколько у меня сложилось впечатление, тут в принципе можно использовать не только вектор, но и список, и деку, и стек. Просто что будет удобнее
archerix вне форума Ответить с цитированием
Старый 15.12.2019, 01:35   #12
archerix
Форумчанин
 
Регистрация: 13.09.2019
Сообщений: 119
По умолчанию

Ну, вот к чему в итоге пришел. Имеется тестовый файл, допустим, на две колонки с действительными значениями.

Код:
0     0
0.25     0.2474
0.5     0.47943
0.75     0.68164
1     0.84147
1.25     0.94898
1.5     0.99749
1.75     0.98399
2     0.9093
2.25     0.77807
2.5     0.59847
2.75     0.38166
3     0.14112
3.25     -0.1082
3.5     -0.35078
3.75     -0.57156
4     -0.7568
4.25     -0.89499
4.5     -0.97753
4.75     -0.99929
5     -0.95892
Вот таким вот способом я его считываю и распихиваю в два вектора.

Код:
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int main()
{
int i, imax;
float x, y;

vector<float> vectX;
vector<float> vectY;

ifstream in("test.dat");
if(!in) {
cout << "He удается открыть файл.\n";
return 1;
}

i=0;
do {
in >> x >> y ;
vectX.push_back(x);
vectY.push_back(y);
i++;
   } while(!in.eof());
in.close();
imax=i;


for (i=0; i<imax; i++) cout << vectX[i] << "       " << vectY[i] << endl;

cout << "!!!!!!!  end  !!!!!!!";

return 0;
}
Вроде все работает. Осталась только одна мелкая, но досадная проблема. Если в файле есть в конце пустые строки, то при выводе добавляется еще строка (походу всегда только одна), в которой повторяется содержимое предыдущей "содержательной" строки. Эту мистику я ниасилил
archerix вне форума Ответить с цитированием
Старый 15.12.2019, 10:13   #13
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,550
По умолчанию

Я - всё о своём Посмотреть этот файл в каком-нибудь hex-редакторе (WinXex, TotalComfnder) - все строки одинаковой длины - или как? А насчет пустых строк (в смысле, одни пробелы, ни одной цифры)- просто их игнорировать. Т.е. считывать не сразу во float, а в строку, и если она не пустая - тогда из неё преобразовывать во float. Я в Си++ не селен, но в простом Си мне вполне хватало sscanf.

Последний раз редактировалось digitalis; 15.12.2019 в 10:17.
digitalis вне форума Ответить с цитированием
Старый 15.12.2019, 12:47   #14
archerix
Форумчанин
 
Регистрация: 13.09.2019
Сообщений: 119
По умолчанию

В hex-редакторах я, к сожалению, не копенгаген

Пришла в голову простая мысль - просто сравнивать считываемые аргументы из первой колонки. Если снова считался такой же, как на прошлом шаге, пошли пустые строки.

Нашел еще функцию to_string(), но не могу понять, почему она у меня не работает. Модуль string подключен.

Последний раз редактировалось archerix; 15.12.2019 в 13:08.
archerix вне форума Ответить с цитированием
Старый 15.12.2019, 13:13   #15
digitalis
Старожил
 
Аватар для digitalis
 
Регистрация: 04.02.2011
Сообщений: 4,550
По умолчанию

Скиньте файл мне в личку, гляну. Или хотя бы фрагмент, если мегабайты .
to_string() судя по имени, это "что-то преобразовать в строку", а не наоборот.
И почему "СИ_плюсники" молчат ?
Цитата:
Если снова считался такой же, как на прошлом шаге, пошли пустые строки.
А если там в самом деле - две одинаковых пары значений ?
digitalis вне форума Ответить с цитированием
Старый 15.12.2019, 13:27   #16
archerix
Форумчанин
 
Регистрация: 13.09.2019
Сообщений: 119
По умолчанию

Предполагается, что в файле забиты аргумент и значение некоей функции, которую после считывания надо интерполировать, дифференцировать и т.п. Потому если значение самой функции и может быть одинаковым в разных точках, то аргумент из первой колонки должен быть уникальным.
А тексты программ и файла с числами я привел полностью в посте. Разве что для проверки в конце файла набил несколько пустых строк.



Мистика какая-то. Попробовал сразу после считывания вывести последний и предпоследний элементы вектора аргументов, с максимальным набежавшим индексом i и i-1:
Код:
cout << "vect 1 2 =    " << vectX[i] << "  " << vectX[i-1] << endl;
Выдает в последнем элементе (пустая строка) какой-то мусор. Но когда я распечатываю вектора целиком, в нем уже сидит предыдущее значение

Последний раз редактировалось archerix; 15.12.2019 в 13:34.
archerix вне форума Ответить с цитированием
Старый 15.12.2019, 13:37   #17
archerix
Форумчанин
 
Регистрация: 13.09.2019
Сообщений: 119
По умолчанию

Цитата:
Сообщение от digitalis Посмотреть сообщение
to_string() судя по имени, это "что-то преобразовать в строку", а не наоборот.
Ну да - я думал, преобразую считанное x в строку и посмотрю, что там по окончании значащих строк вылазит, может, пустая строка. А там какая-то ерунда записывается.
archerix вне форума Ответить с цитированием
Старый 19.12.2019, 04:09   #18
archerix
Форумчанин
 
Регистрация: 13.09.2019
Сообщений: 119
По умолчанию

Короче, вот с таким костылем (if(vectX[imax-1]==vectX[imax-2]) imax-- ) вроде все считывание работает, и при наличии пустых строк в конце, и без них. Хотя загадку того, как последнее значение в векторе Х сначала становится мусором, а потом последним значащим числом, я так и ниасилил

Код:
#include <iostream>
#include <fstream>
#include <vector>

using namespace std;

int main()
{
int i, imax;
float x, y;

vector<float> vectX;
vector<float> vectY;

ifstream in("test.dat");
if(!in) {
cout << "He удается открыть файл.\n";
return 1;
}

i=0;
do {
in >> x >> y ;

vectX.push_back(x);
vectY.push_back(y);

i++;
   } while(!in.eof());
in.close();

imax=i;
if(vectX[imax-1]==vectX[imax-2]) imax--;

for (i=0; i<imax; i++) cout << i << "   " << vectX[i] << "   " << vectY[i] << endl;

cout << "!!!!!!!  end  !!!!!!!";

return 0;
}
archerix вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
C++ Считывание данных из файла bylbyl9tor Помощь студентам 1 11.04.2019 14:26
Считывание данных с файла LittleStudent Помощь студентам 0 29.05.2011 12:08
считывание данных из текстового файла Olejik Общие вопросы по Java, Java SE, Kotlin 3 03.10.2009 20:40
Считывание данных из файла inret Общие вопросы Delphi 4 18.11.2007 18:03
Считывание данных из файла PAVEL315 Общие вопросы Delphi 26 17.12.2006 00:53