【问题标题】:Reading floating points from a file从文件中读取浮点数
【发布时间】:2017-03-05 11:58:23
【问题描述】:

我试图从下面的文件中只读取浮点数,不包括 2D 数组中的所有月份和地区的名称,然后打印 2D 数组但没有得到正确的输出,(输出是零和垃圾值) 请检查我的代码并尝试提供帮助。

Link to the .txt file

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

int main(int argc, char* argv[]){
  FILE *f=fopen("Monthly_Rainfall_Himachal.txt","r");
  float data[12][12];
  int i,j;
  char newLine[1000];
  fgets(newLine,1000,f);
  char* item;
  fgets(newLine,1000,f);
  while(!feof(f)){
    for(i=0;i<12;i++){
      item=strtok(newLine,"\t");
      for(j=0;j<12;j++){
        item=strtok(NULL,"\t");
        data[i][j]=atof(item);
      }
      fgets(newLine,1000,f);
    }
  }
  for(i=0 ;i<12 ;i++){
    for(j=0 ;j<12 ;j++){
      printf("%.1f\t",data[i][j]);
    }
    printf("\n");
  }
  return 0;
}

【问题讨论】:

  • 看起来你正在做很多 sscanf 会为你做的工作。
  • 您能否详细说明一下如何操作,因为我是一个完整的初学者:)
  • 谷歌scanf example
  • Stackoverflow 上有几个例子。例如,请参阅this question and answer。您可以在 Stackoverflow 上搜索 [c] sscanf text file[c] fscanf text file。您也可以使用fscanf,它将直接解析。您还可以通过 Google 搜索 sscanffscanf 的使用情况并找到大量信息。
  • 第一次测试FILE *f=fopen("Monthly_Rainfall_Himachal.txt","r");是否成功。

标签: c multidimensional-array input file-io


【解决方案1】:

不用strtok() 解析你的行,你可以用sscanf() 读取你的浮点数。它们也是有关使用 %n 说明符的信息,这在使用 sscanf() 读取输入时很有帮助。

注意:除了使用fgets()/sscanf(),您还可以直接使用fscanf() 读取您的输入,这是另一种可能的方法。

下面是一些示例代码:

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

#define LINESIZE 1000
#define ROWS 12
#define COLS 12

int main(void) {
    double data[ROWS][COLS];
    char line[LINESIZE];
    char *lineptr = NULL;
    int offset, row = 0, col;
    FILE *fptr;

    fptr = fopen("Monthly_Rainfall_Himachal.txt","r");
    if (!fptr) {
        fprintf(stderr, "Cannot open file!\n");
        exit(EXIT_FAILURE);
    }

    while (fgets(line, sizeof line, fptr) != NULL && row < ROWS) {
        lineptr = line;
        col = 0;
        while (sscanf(lineptr, "%lf%n", &data[row][col], &offset) == 1 && col < COLS) {
            lineptr += offset;
            col++;
        }
        row++;
    }

    for (int i = 0; i < ROWS; i++) {
        for (int j = 0; j < COLS; j++) {
            printf("%.2f ", data[i][j]);
        }
        printf("\n");
    }

    fclose(fptr);

    return 0;
}

【讨论】:

  • 很好奇,为什么" %lf%n" 中有空格?当然不需要。风格问题?
  • @chux 每当我使用scanf()fscanf()sscanf() 时,我都会这样做。在这种情况下,我认为它可以被删除。感谢您指出这一点:)。
  • 我尝试使用示例程序,也尝试了 fscanf、sscanf,但都失败了,请帮帮我,这很紧急
  • 输出只有零和垃圾值
猜你喜欢
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
  • 1970-01-01
  • 2021-10-19
  • 2011-02-15
相关资源
最近更新 更多