0

我有一个 csv 数据,它包含这个结构:

2345678 Meier   Hans    12.10.1985  2.4
int, char[],char[], date,float

我想用这些数据类型从这一行创建一个结构,我必须将结构放入一个数组中,现在当我读取 date 时,我应该在结构中使用什么变量类型?以及如何将单日、月份和年份数字读入我的类型?是否有在每个点(“。”)拆分的拆分功能?我应该使用“struct tm ts”并将日期月份和年份分配给 ts.constants 吗?(ts_mday;ts_mmonth 等。)

到目前为止我做了什么:

#include <fstream>
#include <stdio.h>
#include <iostream>
#include <ctime>
using namespace std;

int main()
{
    struct studentendaten {
        int matrnr;
        char[] name;
        char[] vorname;     
        struct tm ts;           
        ts.tm_mday; 
        ts.tm_mon;
        ts.tm_year; 
        float note;
    }


  FILE * pFile;
  int ch;  
  int n = 0;
  pFile=fopen("studentendaten.txt","r");  
  if (pFile==nullptr) perror ("Error opening file");
  else
  {       
    while (ch != EOF) 
    {
      ch = fgetc (pFile);
      if (ch == ';') {n++;}
      putchar(ch);
    }   
    fclose (pFile);
    }


  return 0;
}
4

2 回答 2

2

您可以使用 strptime() 解析日期字符串并将其存储在 tm 结构中。tm 结构包含日、月和年的字段。请记住,月份的日期从 0 到 11 计数,年份从 1900 开始。使用 strftime() 将 tm 结构转换回字符串。

例子:

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

int main( int argc, char** argv)
{
  struct tm ts;

  if( argc > 1 )
  {
    memset( &ts, '\0', sizeof( ts ) );

    const char* cp = strptime( argv[1], "%d.%m.%Y", &ts );

    if( cp != NULL )
    {
      char buf[16];
      strftime( buf, sizeof( buf ), "%d.%m.%Y", &ts );
      printf( "%s\n", buf );
    }
  }

  return 0;
}
于 2013-10-31T18:16:37.357 回答
1

现在当我阅读日期时,我应该在结构中使用什么变量类型?

我会使用 type 类std::tm,标准的 C 类日期。

以及如何将单日、月份和年份数字读入我的类型?

这就是问题。没有一种标准的方式来解释日期。日期因某些文化习俗而异。出于这个原因,日期的格式化、插入和提取通常委托给语言环境的time_puttime_get方面。

您可以将此功能合并到一个提取器中,该提取器不仅可以检查有效的流状态(因为插入将使用具体的文件流类完成,而不是FILE),而且还可以确定操作是否成功。例如:

#include <fstream>
#include <iterator>
#include <locale>
#include <ctime>

struct date // a simple date class
{
    std::tm ts;
};

template <class CharT, class Traits>
std::basic_istream<CharT, Traits>&
    operator>>(std::basic_istream<CharT, Traits>& is, date& d)
{
    if (!is.good())
        return is;

    std::ios_base::iostate err = std::ios_base::goodbit;
    try
    {
        typename std::basic_istream<CharT, Traits>::sentry s(is);
        if (s)
        {
            std::istreambuf_iterator<CharT> o
                = std::use_facet<std::time_get<CharT,
                   std::istreambuf_iterator<CharT>>>(is.getloc()).get_date(
                    is, std::istreambuf_iterator<CharT>(), is, err, &d.ts);

            if (o != std::istreambuf_iterator<char>())
                err |= std::ios_base::failbit;
        } else
        {
            is.width(0);
            return is;
        }
    } catch(std::ios_base::failure&)
    {
        //  check the exception mask set the stream state
    }

    is.setstate(err);
    is.width(0);
    return is;
}

int main()
{
    std::ifstream in("in.txt");
    date d;
    in >> d;
}

这是提取器。插入器应该看起来有点相似,除了您将使用time_putand istreambuf_iterator。你还要确保检查插入失败并设置badbit如果是这样。

于 2013-10-31T18:11:31.347 回答