2014-01-20 3 views
3

У меня был этот код на C++, который работает нормально, сначала попросите пользователя указать имя файла , а затем сохраните некоторое количество в этом файле.file setprecision C++ code

Но что я пытаюсь сделать, это сохранить номера с двумя знаками после запятой, например в типов пользователей 2, и я хочу, чтобы сохранить номер 2, но с двумя знаками после запятой 2.00.

Любые идеи о том, как это сделать?

#include <iostream> 
#include <fstream> 
#include <iomanip> 
using namespace std; 

int main() { 
    double num; 
    double data; 
    string fileName = " "; 
    cout << "File name: " << endl; 
    getline(cin, fileName); 
    cout << "How many numbers do you want to insert? "; 
    cin >> num; 
    for (int i = 1; i <= num; i++) { 
    ofstream myfile; 
    myfile.open(fileName.c_str(), ios::app); 
    cout << "Num " << i << ": "; 
    cin >> data; 
    myfile << data << setprecision(3) << endl; 
    myfile.close(); 
    } 
    return 0; 
} 
+3

Почему вы используете 'setprecision()' * после * записи 'data'? – nobar

+3

@nobar: вы должны, вероятно, сделать ответ, поскольку это почти наверняка проблема здесь. – PeterK

+0

Я не знаю, просто пытаясь запланировать способ сделать это:/ – user3214262

ответ

7

Хорошо, вы должны использовать setprecision до записи данных.

Я бы также переместил открытый и закрытый файл из цикла (и объявление myfile, конечно, как правило, это довольно «тяжелая» операция для открытия и закрытия файла внутри цикла.

Вот небольшая демонстрация, которая работает:

#include <iostream> 
#include <fstream> 
#include <iomanip> 

int main() 
{ 
    std::ofstream f("a.txt", std::ios::app); 
    double d = 3.1415926; 

    f << "Test 1 " << std::setprecision(5) << d << std::endl; 

    f << "Test 2 " << d << std::endl; 

    f << std::setprecision(7); 
    f << "Test 3 " << d << std::endl; 

    f.precision(3); 
    f << "Test 3 " << d << std::endl; 

    f.close(); 


} 

Заметим, однако, что если ваш номер, например 3.0, то вам необходимо std::fixed Например, если мы делаем это:.

f << "Test 1 " << std::fixed << std::setprecision(5) << d << std::endl; 

он покажет 3.00000

+0

ofstream myfile; for (int i = 1; i <= num; i ++) { myfile.open (fileName.c_str(), ios :: app); cout << "Num" << i << ":"; cout << setpresition (2); std :: cout << std :: setprecision (3) << endl; cin >> данные; myfile << данные << endl; } myfile.close(); Я изменяю свой код и теперь выгляжу так, но я все еще gt:/ – user3214262

+0

@ user3214262 'setprecision()' специфичен для потока. Если вы хотите, чтобы это применимо к 'myfile', вы должны применить его к' myfile', а не к 'std :: cout'. – Angew

+0

Спасибо Матс Петерсон – user3214262