【问题标题】:Scanning Comma Separated Text File Data into Arrays with C用 C 将逗号分隔的文本文件数据扫描成数组
【发布时间】:2017-04-25 05:20:07
【问题描述】:

我的目标是编写一个代码,将文本文件中的所有逗号分隔数据扫描到一个数组中。为了确保它成功,终端将以相同的方式打印出数据。

数据文件的一个例子是

XXXX,location,yy,mm,dd,max,min
XXXX,86282,1990,3,1,24.9,18
XXXX,86282,1990,3,2,30.2,15.7
XXXX,86282,1990,3,3,28.2,17.2
XXXX,86282,1990,3,4,28.6,18
XXXX,86282,1990,3,5,25.2,17.5
XXXX,86282,1990,3,6,19.2,15

我做的是这个

int i = 0;
int a_location[50000];
int a_yy[50000];
int a_mm[50000];
int a_dd[50000];
double a_max[50000];
double a_min[50000];
int location, yy, mm, dd;
double max, min;

while((c=getchar()) != EOF){
    while(scanf("XXXX,%d,%d,%d,%d,%lf,%lf\n",&location, &yy, &mm, &dd, &max, &min) == 6){a_location[i] = location;
    a_yy[i] = yy;
    a_mm[i] = mm;
    a_dd[i] = dd;
    a_max[i] = max;
    a_min[i] = min;

    i+=1;
    }
}

for(i = 1; i < nlines; i++){
    printf("%d,%d,%d,%d,%0.3f,%0.3f\n", a_location[i], a_yy[i], a_mm[i], a_dd[i], a_max[i], a_min[i]);

}

终端显示这个

./scan.exe<datafile.txt
0,0,0,0,0.000,0.000
0,0,0,0,0.000,0.000
0,0,0,0,0.000,0.000
0,0,0,0,0.000,0.000
0,0,0,0,0.000,0.000
0,0,0,0,0.000,0.000

我想弄清楚出了什么问题。

【问题讨论】:

  • 什么是nlines
  • 我无法重现您的问题。但是,由于您列出的代码中有两个未声明的变量(cnlines),您显然没有正确复制粘贴和测试问题中的代码,因此所有的赌注都没有了。
  • 欢迎来到 Stack Overflow! 寻求调试帮助的问题(“为什么这段代码不起作用?”)必须包括所需的行为、特定的问题或错误以及在问题本身中重现它所需的最短代码。没有明确问题陈述的问题对其他读者没有用处。请参阅:如何创建minimal reproducible example
  • 注意,使用getchar()读取行首字符并不是一个特别好的主意;通常,您需要将该字符读入字符串。此外,如果您要手动输入数据,则在格式字符串中使用带有尾随换行符的scanf() 是一个小灾难。并且使用scanf() 处理行是不好的;在大多数情况下,它不关心换行符或空格。你最好用fgets() 阅读这些行,然后用sscanf() 解析结果。

标签: c arrays debugging scanf


【解决方案1】:

您得到该结果是因为您将第一行的字符串值保存在数字数组中。

您可以忽略第一行,然后处理以下行,以防格式保持不变。

  int i = 0;
  int a_location[50000];
  int a_yy[50000];
  int a_mm[50000];
  int a_dd[50000];
  double a_max[50000];
  double a_min[50000];
  int location, yy, mm, dd;
  double max, min;

  scanf("XXXX,location,yy,mm,dd,max,min\n");
  while(scanf("XXXX,%d,%d,%d,%d,%lf,%lf\n",&location, &yy, &mm, &dd, &max, &min) == 6)
  {
    a_location[i] = location;
    a_yy[i] = yy;
    a_mm[i] = mm;
    a_dd[i] = dd;
    a_max[i] = max;
    a_min[i] = min;
    i++;
  }

  for(i = 0; i < nlines; i++){
    printf("%d,%d,%d,%d,%0.3f,%0.3f\n", a_location[i], a_yy[i], a_mm[i], a_dd[i], a_max[i], a_min[i]);

如果按照这个方法,for的索引必须从0开始。 问候。

【讨论】:

  • scanf(...) == 6 将处理第一行。转换失败,并且 scanf 为第一行返回 0,因为正确读取了 0 个变量。这不是问题。
  • 你说的是真的,但是这样就避免了用getchar()处理。此外,for() 索引必须从 0 开始
猜你喜欢
  • 1970-01-01
  • 2016-08-19
  • 1970-01-01
  • 1970-01-01
  • 2023-02-02
  • 2020-06-04
  • 2023-04-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多