user1673206
user1673206

Reputation: 1711

fixed amount of digits on creating .txt file

I need to create file with specific file name format (on windows). the format is:

Name_nodeNum_frequency.txt

nodeNum is int and frequency is float.

those two variables should be written with fixed digits:

if nodeNum is 8 --> 008

if frequency is 4.88421 --> 4.884

this is the function:

create_file(int nodeNum, double frequency)
{
  char buffer [50];

  //convert int to string
  itoa(nodeNum, buffer, 10);
  string sNodeNum = string(buffer);

  //not sure about the double
  //tried to_string but I got:
  // more than instance of overloaded function matches the argument list


  string fileName = ("Name_" + sNodeNum + "_" + sfreq + "MHZ");
  FILE* pFile = OpenFile(fileName);
}

I tried to use %d, but it seems like I should not do that:

string fileName = ("Delay_" + "%3d" + "_" + sfreq + "MHZ" , sNodeNum);

I will be happy for some guidance.

thanks!

Upvotes: 2

Views: 65

Answers (2)

Tom Fenech
Tom Fenech

Reputation: 74695

You seem to be mixing C and C++ here. A simple way to do this in C would be:

#include <stdio.h>

int main()
{
  int sNodeNum = 8;
  double sfreq = 4.88421;
  char filename[50];
  sprintf(filename, "Delay_%03d_%.3fMHZ.txt", sNodeNum, sfreq);
  FILE* pFile = fopen(filename, "w");
  return 0;
}

If on the other hand, if you want to use C++, you should make a few changes:

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

int main()
{
  int sNodeNum = 8;
  double sfreq = 4.88421;    
  std::ostringstream ss;
  ss << "Delay_" << std::setfill('0') << std::setw(3) << sNodeNum
     << "_" << std::setprecision(4) << sfreq << "MHZ.txt";
  std::string filename(ss.str());    
  std::ofstream fout(filename.c_str());
  return 0;
}

Each of these two approaches opens a file for writing, with the name Delay_008_4.884MHZ.txt.

Upvotes: 3

Piotr Skotnicki
Piotr Skotnicki

Reputation: 48527

Live demo link

#include <string>
#include <iomanip>
#include <iostream>

int nodeNum = 8;
float frequency = 4.88421f;

std::ostream& out = std::cout; // put your std::ofstream file or std::ostringstream

std::ios::fmtflags flags = out.flags();

out.width(3);
out.fill('0'); 
out.setf(std::ios::right, std::ios::adjustfield);
out << nodeNum << std::endl;

flags = out.flags(flags);

out.precision(3);
out.setf(std::ios::fixed, std::ios::floatfield); 
out << frequency;

out.flags(flags);

Or even simpler:

out << std::setw(3) << std::setfill('0') << std::right << nodeNum << std::endl;

out << std::setprecision(3) << std::fixed << frequency;

Output:

008
4.884

Upvotes: 1

Related Questions