В С: формат для печати ГГГГММДД в ​​формате ММ-ДД-ГГГГ - PullRequest
1 голос
/ 17 января 2011

Скажите, что я хочу напечатать, используя

printf(format, "YYYYMMDD");

Как бы выглядел формат, если бы я хотел, чтобы мой вывод выглядел как "MM-DD-YYYY"?

Спасибо.

Позвольте мне добавить мой полный код, чтобы не было путаницы.

У меня есть структура, определенная как

typedef struct{
       char     *dt;    
       float     op, hi, lo, cl, vl; 
}STOCKDATA; 

Затем вызовите функцию:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stddef.h>

#include "../include/struct.h"
#include "../include/function.h"
#include "../include/utility.h"

#define linemax 514 
void  stockData(char *ticker)     
{
     extern STOCKDATA *stockdata;
     extern int nrows;

     //count number of lines in file..............................
       char *filename;
       mkstring("../data/", ticker, filename);
       nrows=linesInFile(filename);

     //allocate stockdata.........................................

       stockdata=malloc_stockdata(0,nrows-1);

     //open file to read into stockdata...........................
     FILE *fp;
     fp = fopen(filename, "r");   
     if(fp==NULL) 
     {
         printf("%s%s\n", "Can't open data file ", filename);
         exit(1);
     }

     char delimiters[] = " ,";
     char line[linemax];

     char *tmp;

     fgets(line, linemax, fp);               //skip header 

     int  count=0;                           //count number of lines
     while( fgets(line, linemax, fp) !=NULL)
     {
          tmp=strtok(line, delimiters);      //ticker (skipped)

          stockdata[count].dt= strtok(NULL, delimiters);         //date
//printf("%s\n", stockdata[count].dt);
          stockdata[count].op=atof(strtok(NULL, delimiters));   //open
          stockdata[count].hi=atof(strtok(NULL, delimiters));   //high
          stockdata[count].lo=atof(strtok(NULL, delimiters));   //low
          stockdata[count].cl=atof(strtok(NULL, delimiters));   //close
          stockdata[count].vl=atof(strtok(NULL, delimiters));   //volume

          count++;
     }

     fclose(fp);
}

Затем вызовите функцию:

#include<stdio.h>
#include<stdlib.h>
#include<string.h>

#include "../include/struct.h"
#include "../include/function.h"
#include "../include/utility.h"


#define cutoff 10
void writeData(char *ticker)
{

   extern STOCKDATA  *stockdata;
   extern int nrows;

  //open output file........................................
   char *filename;
   mkstring("../output/", ticker, filename);

    FILE *fp;
    fp = fopen(filename, "w");
    if(fp==NULL)
    {
         printf("%s%s\n", "Can't open data file ", filename);
         exit(1);
    }


  int k;
  char *format="%-15s%-10.2f%-10.2f%-10.2f%-10.2f%-10.0f\n";
  for (k=nrows-cutoff; k<nrows; k++)
  {
   fprintf(fp, format, stockdata[k].dt,
                       stockdata[k].op,
                       stockdata[k].hi,
                       stockdata[k].lo,
                       stockdata[k].cl,
                       stockdata[k].vl );

  }

  fclose(fp);

}

Теперь, когда я определяю «формат» в последнем вызове функции, я пытаюсь заставить его печатать stockdata [k] .dt в формате MM-DD-YYYY. Строка в файле данных имеет формат ГГГГММДД.

Ответы [ 3 ]

5 голосов
/ 17 января 2011

Вы хотите посмотреть на strptime и strftime. Во-первых, вам нужно проанализировать вашу дату (используя strptime) следующим образом:

struct tm timeStruct;
strptime(dateString, "%Y%m%d", &timeStruct);

Затем преобразуйте его в новый формат, используя strftime:

strftime(outputString, sizeof(outputString), "%m-%d-%Y", &timeStruct);

Теперь outputString содержит дату в нужном формате.

4 голосов
/ 17 января 2011

Возможно, вы ищете strptime и strftime .

0 голосов
/ 17 января 2011

Каков формат ваших исходных данных?

Если это действительно строка "YYYYMMDD", просто используйте %.4s и %.2s с соответствующими смещениями, добавленными к указателю, чтобы получить части, которые выхотите.

Если это число вида YYYYMMDD (десятичное число), используйте x/10000, x/10%100 и x%100, чтобы получить детали, а %.4d и %.2d дляформаты.

Если это фактическое время, используйте strftime.

...