2017-02-21 7 views
1

Я пытаюсь прочитать два числа двойных значений, хранящихся в одной строке, разделенных запятой из текстового файла или файла csv в вектор. Номера хранятся в таком формате, как это [1688,37, 115,14]. Я хотел бы прочитать эти числа из файла, а затем сохранить в массиве, чтобы получить доступ к первому и второму номерам. Мой код компилируется, но не отображает числа. Вот код в C++.Прочитать двойные значения чисел из файла в вектор в C++ и получить доступ к их значениям

ifstream file("C:/arrow1.txt",ios::app); 
double s; 
std::vector<double> data; 
while(file>>s){ 
data.push_back(s); 
       } 
    for(int i=0; i<data.size(); i++){ 
    std::cout<<data[i]<<std::endl; 
       } 

Этот код считывает и отображает номера, но в той же строке, что и строка. Тогда я не знаю, как получить доступ к первому и второму номерам

ifstream fh("C:/arrow1.csv",ios::app); 
std::vector<std::string> vs; 
std::string s; 
while(fh>>s){ 
    vs.push_back(s); 
} 
for(int i=0; i<vs.size(); i++){ 
    std::cout<<vs[i]<<std::endl; 
} 

Любая помощь?

+0

Можете ли вы добавить содержимое файла примера и правильно отформатировать код. – Shreevardhan

+0

Я не понимаю, что добавить? ? – user3035413

+0

Я должен сказать, что числа, хранящиеся в файле, неизвестны. Они исходят из результатов из другой программы, но я не знаю, что будет выходом. – user3035413

ответ

1

Вы можете использовать вторую попытку в комбинации с atof() (Have a look here). Он преобразует string в double.

Скопируйте первое число во вторую строку и затем используйте atof(), чтобы получить двойное значение.

Пример:

// Your copied values from the file 
std::string s1 = "[1688.37,"; 
std::string s2 = "115.14]"; 

// Copy the number without "[" and ",", the length of the number is variable 
std::string str1 = s1.substr(1, s1.length()-1); // Copy the first number in str1 
double firstNum = atof(str1.c_str()); 
cout << firstNum << endl; 

// Copy the second number without "]" 
std::string str2 = s2.substr(0, s2.length()-1); // Copy the second number in str2 
double secondNum = atof(str2.c_str()); 
cout << secondNum << endl; 
+0

Оператор '>>' для 'std :: string' использует пробел для синтаксического анализа текста. Итак, используя пример OP [1688.37, 115.14], экземпляры 'std :: string', добавленные в вектор во втором примере кода, будут« [1688.37, »и« 115.14] ». Итак, строки не готовы для 'atof()' в этот момент. – GigaRohan

+0

Я пытался, но имел ошибку при использовании atof(). Может ли кто-нибудь дать мне правильный код, как его использовать? – user3035413

+0

@GigaRohan, поэтому я рекомендовал скопировать число во вторую строку. Я думаю, что это самый простой способ избавиться от '[],' – izlin

1

Если istream (будь то stringstream, ifstream) объявлен как s в следующем примере содержит четко определенный шаблон любого количества строк формата [float1, float2] - вы можете использовать >> оператор (поток оператор экстракции в данном случае) на потоке для считывания значений и get вызов, чтобы читать символы ,, [, ] и newline, как показано в следующем примере:

std::vector<double> fpvec; 
char c; 
double in; 
while(s.eof() == false) 
{ 
    s.get(c); 
    s >> in; 
    fpvec.push_back(in); 
    s.get(c); 
    s >> in; 
    fpvec.push_back(in); 
    s.get(c); 
    s.get(c); 

    // Print last two inserted elements - testing purposes only 
    unsigned int size = fpvec.size(); 
    std::cout << fpvec[size-2] <<" and "<< fpvec[size-1] << std::endl; 
} 
+0

вывод второго кода [1688.37 и 115.14] – user3035413

+0

@ user3035413 - без символов '[', ',' и ']', я думаю? Вывод должен быть «1688.37 и 115.14», если у вас есть только одна строка с двумя удвоенными точками, разделенными запятой, и линия завершается с помощью [и]. Проверьте это: http://www.tutorialspoint.com/compile_cpp11_online.php?PID=0Bw_CjBb95KQMNThaS2tNZlFuanM –

+0

@ user3035413 И вы получили числа в векторе fpvec! Разве это не то, о чем вы просили? –

 Смежные вопросы

  • Нет связанных вопросов^_^