Gerar vários arquivos dats com numeração diferente

1. Gerar vários arquivos dats com numeração diferente

Lendel dos Santos Rodrigues
lendel

(usa Linux Mint)

Enviado em 24/09/2017 - 20:06h

bom queria que alguém me ajudasse a escrever um código que gerasse vários dats numeração diferente! exemplo: arquivo1.dat, arquivo2.dat, arquivo3.dat... se alguém souber como fazer isso agradeço



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

using namespace std;

int main (int argc, char *argv[]){


double i;


ofstream outfile; //criamos objeto da classe ofstream
outfile.open("tabela.dat"); //chamamos a função membro da classe para o objeto criado.
// Esta função membro cria o arquivo "tabela.dat"

if (outfile.is_open() && outfile.good()) //verificamos se está tudo bem
{

for(i = 1; i <= 1; i++){
outfile <<
"reset" << endl <<
"f(x) = x*(1-B*(x**2-1))" << endl <<
"B=0.01" << endl <<
"set xrange [0:10]" << endl <<
"set yrange [-5:5]" << endl <<
"set title 'Programa3'" << endl <<
"set ylabel 'lambda'" << endl <<
"set xlabel 'n'" << endl <<
"set size 1,1" << endl <<
"y=0" << endl <<
"plot f(x) title 'B=0.01', y" << endl <<
"set term post eps enhanced color" << endl <<
"set out 'programa3.eps'" << endl <<
"plot f(x) title 'B=0.01', y"
<< endl; //coloca o array no objeto criado.
}

outfile.close(); //fechamos o objeto.
}

return 0;
}



  


2. Re: Gerar vários arquivos dats com numeração diferente

Fernando
phoemur

(usa Debian)

Enviado em 24/09/2017 - 21:44h

Você pode chamar um stat para ver se o arquivo existe, caso exista você vai incrementando um número de sufixo até que ache um arquivo que não exista. daí você abre e escreve. Mas só funciona em POSIX.

Outra alternativa seria usar boost::filesystem ou mesmo std::filesystem que foi padronizado no c++17




3. Re: Gerar vários arquivos dats com numeração diferente

Uilian Ries
uilianries

(usa Linux Mint)

Enviado em 24/09/2017 - 21:45h

Você pode validar diretamente o handle do fstream.


#include <cstring>
#include <fstream>
#include <stdexcept>

int main() {

static const int name_size(32);
char file_name [name_size] = {};

for (int i = 0; i < name_size; ++i) {
::snprintf(file_name, name_size, "arquivo-%.2d.dat", i);
std::ofstream ofs(file_name);
if (!ofs) {
throw std::runtime_error("Não pode criar arquivo");
}
ofs << "Foo";
}

return 0;
}



4. Re: Gerar vários arquivos dats com numeração diferente

Fernando
phoemur

(usa Debian)

Enviado em 24/09/2017 - 22:51h

Minha idéia era mais ou menos assim, você verifica se o arquivo existe. Se não existe abre e escreve.
Se ele existe, você vai incrementando um número até que o arquivo não exista, daí você abre e escreve.
Mas não sei se eu entendi o seu problema direito...
Pois se for apenas pra escrever arquivos diferentes é só fazer um loop mesmo...

Cada vez que você rodar o programa ele escreve no arquivo seguinte...

Dava pra fazer a função mais curta se fosse recursiva, mas optei por fazer iterativa...

Fiz assim:

#include <fstream>
#include <stdexcept>
#include <string>
#include <sys/stat.h>

using namespace std;

bool file_exists(const string& filename)
{
struct stat stat_buf;
int rc = stat(filename.c_str(), &stat_buf);
return rc == 0 ? true : false;
}

string get_file_name(const string& basename) // basename é o nome inicial
/* essa função gera nomes de arquivos sequenciais se o arquivo já existe...
* ex.: arquivo1.dat, arquivo2.dat, arquivo3.dat
* arquivo arquivo1 arquivo2 (etc...) */
{
if (!file_exists(basename)) {
return basename;
}
else {
string prefix, suffix;

auto pos = basename.rfind('.'); //retirar a extensão do nome

if (pos != string::npos){
prefix = basename.substr(0, pos+1);
suffix = basename.substr(pos, string::npos - pos); //extensão
prefix = prefix.substr(0, prefix.find_last_not_of("1234567890")); // retire numeros tb
}
else {
prefix = basename.substr(0, basename.find_last_not_of("1234567890")+1);
suffix = "";
}

int i = 1;
while (true) {
string filename = prefix + to_string(i) + suffix;
if (!file_exists(filename)) {
return filename;
}
++i;
}
}
}


int main()
{
auto filename = get_file_name("arquivo.dat");
ofstream myfile {filename, ios::out | ios::trunc}; // Abre aqui e fecha sozinho quando sair do escopo
if (!myfile.is_open()) {throw std::runtime_error("Falha ao abrir arquivo"); }

myfile << "reset" << endl <<
"f(x) = x*(1-B*(x**2-1))" << endl <<
"B=0.01" << endl <<
"set xrange [0:10]" << endl <<
"set yrange [-5:5]" << endl <<
"set title 'Programa3'" << endl <<
"set ylabel 'lambda'" << endl <<
"set xlabel 'n'" << endl <<
"set size 1,1" << endl <<
"y=0" << endl <<
"plot f(x) title 'B=0.01', y" << endl <<
"set term post eps enhanced color" << endl <<
"set out 'programa3.eps'" << endl <<
"plot f(x) title 'B=0.01', y"
<< endl;
return 0;
}



5. Re: Gerar vários arquivos dats com numeração diferente

Lendel dos Santos Rodrigues
lendel

(usa Linux Mint)

Enviado em 25/09/2017 - 11:39h

Bom a ideia real era mudar o nome do arquivo que vai ser salvo em forma de loop outfile.open("tabela.dat"), ou seja, o primiero ficaria tabela1.dat, e segundo arquivo gerado seria tabela2.dat e assim por diante! teria como eu sair mudando os numeros que estão acompanhando textos dentro do cout?

outfile <<
"reset" << endl <<
"f(x) = x*(1-B*(x**2-1))" << endl <<
"B=0.01" << endl << // esse valor de B fosse subindo 0.01 depois 0.02 e assim por diante
"set xrange [0:10]" << endl <<
"set yrange [-5:5]" << endl <<
"set title 'Programa3'" << endl << //no caso esse programa3 depois do loop ele ficaria programa4 e assim por diante
"set ylabel 'lambda'" << endl <<
"set xlabel 'n'" << endl <<
"set size 1,1" << endl <<
"y=0" << endl <<
"plot f(x) title 'B=0.01', y" << endl <<
"set term post eps enhanced color" << endl <<
"set out 'programa3.eps'" << endl << // mesma coisa aqui
"plot f(x) title 'B=0.01', y"
<< endl; //coloca o array no objeto criado.


preciso aprender isso porque quero gerar um script para plotar gráficos no gnuplot! e aprender a gerar dats com números diferentes para para gerar imagens no gnuplot...






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts