читать из файла и конвертировать в double в C ++ - PullRequest
0 голосов
/ 31 марта 2011

У меня проблема с чтением из файла и преобразованием контента в двойной. Я прочитал решения от stackoverflow, но ничего не работает.

У меня есть этот входной файл:

1291.23
291.493
558.089
309.266
513.656
491.44
429.234
851.345
589.192
535.873
802.469
713.604
1002.42
997.973
513.656
313.709
407.018
624.738
460.337
526.986
473.667
1202.36

и программа:

#include <math.h> 
#include <string> 
#include <iostream> 
#include <fstream> 
#include <stdio.h> 
#include <sstream> 

using namespace std; 
void main() { 
    char* filename = "mr1.txt"; 
    ifstream fin; 
    fin.open(filename); 
    float d;// = 0.0; 
    int v = 0; 
    while (v < 21){ 
        fin>>d; 
        if(v >= 2 || v < 15){ 
            cout<<d<<endl;
        } 
        v++; 
    } 
}

вывод: 1291 для 12 раз

Как я могу без проблем конвертировать эти файлы в двойной? Спасибо!

Ответы [ 5 ]

2 голосов
/ 31 марта 2011

В вашем коде есть несколько ошибок, но ни одна из них не объясняет описываемый вами признак (что невозможно с кодом, который вы разместили: вы выполняете цикл 40 раз и выводите каждый раз в цикле).В любом случае:

  • У вас есть условие в `if` неправильно, так что это всегда так:` v` всегда либо больше 2 или меньше 15,
  • Youу вас неправильное условие "while";вы пытаетесь прочитать 40 значений, независимо от того, что находится в файле

То, что ваш цикл, вероятно, должен выглядеть так:

while ( fin >> d ) {
    if ( v >= 2 && v < 15 ) {
        std::cout << v << std::endl;
    }
    ++ v;
}

Это приведет к появлению элементов [2,15) для отображения при условии, что они присутствуют.

Если вы всегда отображаете одно и то же значение, возможно, что ввод после этого значения был неудачным, учитывая, что вы не проверяете, был ли ваш ввод успешным илине.Одно из возможных объяснений - моала, упомянутая в заметке: когда вы открываете файл, он наполняется текущей глобальной локалью.Попробуйте:

fin.imbue(std::locale("C"));

сразу после открытия файла;в большинстве языков десятичный разделитель - это запятая, а не точка.(Также: проверьте, что открытие прошло успешно.)

1 голос
/ 31 марта 2011

У Джеймса Канзе лучший совет относительно того, как перебирать файл. Но я уверен, что это должно быть:

std::cout << d << std::endl;

В противном случае вы будете печатать номера строк.

Кроме того, я хотел бы отметить, что у вас есть много ненужных включений. Не то, чтобы это имело значение, но все, что вам действительно нужно на этом этапе - это iostream и fstream. Все остальное лишнее.

И последнее. Если вам нужно, чтобы ввод был двойным, почему вы помещаете их в переменную типа float?

1 голос
/ 31 марта 2011

Для быстрой проверки работоспособности попробуйте просто скопировать весь файл в стандартный вывод, примерно так:

#include <iostream>
#include <iterator>
#include <algorithm>

int main() {    
    std::ifstream in("mr1.txt");
    std::copy(std::istream_iterator<double>(in),
              std::istream_iterator<double>(),
              std::ostream_iterator<double>(std::cout, "\n"));
    return 0;
}
1 голос
/ 31 марта 2011
1 голос
/ 31 марта 2011

Вы видите последние 15 строк выходных данных вашей программы, поскольку переменная v продолжает увеличиваться по числу строк в файле данных.

Измените while (v < 40) на while(v < 21)увидит то, что вы ожидаете увидеть.

...