2014-03-24 2 views
1

У меня естьсоздания Дат файл с увеличением числа порядка в Visual C++

particle:: add_particle(int i) 
     { 

     ofstream fp1; 
     fp1.open("output/particle.dat",ios::binary); 


     fp1.write((char*)this,sizeof(*this)); 

     fp1.close(); 

      } 

      fp1.close(); 
     } 

и петля это сложение с использованием

for(int i=0;i<20;i++) 
    { 

      p.add_particle(i); 



    } 

однако во время каждого цикла, я хочу, чтобы имя файла, чтобы быть particle0. dat particle1.dat particle2.dat и так далее;

Как я могу получить его на Visual C++;

ответ

0
for(int i = 0; i < 20; ++i) { 
    std::stringstream str; 
    str << "output/particle" << i << ".dat"; 
    fp1.open(str.str().c_str(), ios::binary); 
    ... 
} 

Вы можете указать номер форматирование с помощью:

str.width(2); 
str.fill('0'); 
... 

См: http://www.cplusplus.com/reference/sstream/stringstream/?kw=stringstream

+1

#include должны быть включены для того, чтобы сделать приведенный выше код не показывать ошибки –

0

sprintf может пригодиться для вашего случая.

// create a variable for storing the output buffer 
// the following should execute in loop 

char buffer[200]; 
int value = 0; 
sprintf(buffer, "output/particle%d.dat", value); 
value++; 
+0

Может быть, если они используют C вместо C++ ... – crashmstr

0

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

unsigned int currentFileNumber(const char *dir, const char *start) 
{ 
    unsigned int ret = 0; 
    unsigned int len; 
    _Bool matched; 
    WIN32_FIND_DATA fd; 
    HANDLE hfind; 
    char best[MAX_PATH] = ""; 
    char pattern[MAX_PATH]; 

    snprintf(pattern, sizeof(pattern), "%s\\%s???.dat", dir, start); 
    hfind = FindFirstFile(pattern, &fd); 
    if (hfind != INVALID_HANDLE_VALUE) { 
     len = strlen(fd.cFileName); 
     matched = isdigit(fd.cFileName[len-7]) && isdigit(fd.cFileName[len-6]) && isdigit(fd.cFileName[len-5]); 
     do { 
      len = strlen(fd.cFileName); 
      if (((fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) == 0) 
      && isdigit(fd.cFileName[len-7]) 
      && isdigit(fd.cFileName[len-6]) 
      && isdigit(fd.cFileName[len-5]) 
      && (!matched || (strcmp(best, fd.cFileName) < 0))) { 
       matched = 1; 
       strcpy(best, fd.cFileName); 
      } 
     } while (FindNextFile(hfind, &fd)); 
     FindClose(hfind); 
     if (matched) { 
      ret = (100 * (best[len-7] - '0')) + (10 * (best[len-6] - '0')) + (best[len-5] - '0') + 1; 
     } 
    } 

    return ret; 
} 

static void currentFileName(const char *dir, char *dest, size_t size) 
{ 
    unsigned int n; 

    n = currentFileNumber(dir, "particle"); 
    snprintf(dest, size, "%s%3.3u.dat", start, n); 
} 
Смежные вопросы