【问题标题】:Data read separately fscanf数据单独读取 fscanf
【发布时间】:2015-01-24 17:05:36
【问题描述】:

我正在尝试从文件中读取数字。文件格式如下:

2 4 5 7
3 2 4 7

我尝试使用fscanf 收集所有数字到换行符并将数字存储在一个数组中,与第二行相同。但直接从第二行开始不会再次开始并将其存储在另一个数组中。是否可以使用fscanf 做到这一点?

int main(void)
{
    FILE* fp;
    int *vec = malloc(sizeof(int)*6);
    int *vec_2 = malloc(sizeof(int)*6);
    int row, i;

    fp = fopen("vector.txt","r");

    for(i = 0; i < row; i++) //I don't know how to read until newline
        fscanf(fp, "%d", &vec[k]); //here store the first row in the array

    for(i = 0; i < row; i++)
       fscanf(fp, "%d", &vec_2[i]); //start reading here from the second row

    free(vec);
    free(vec_2);
    return 0;
}

【问题讨论】:

  • 是的,这是可能的。此外,如果行数是固定的并且已知,您可以执行fscanf(file, "%d %d %d %d", &amp;a, &amp;b, &amp;c, &amp;d);。稍等片刻,您就可以开始了。
  • 但我的意图是将数字存储在数组中
  • 您想要为每一列创建一个数组,还是为整个文件创建一个数组?
  • 我想将第一行存储在一个数组中,第二行存储在另一个数组中
  • 请贴出你试过的代码,有很多信息你没有告诉。

标签: c file scanf


【解决方案1】:
int main(void){
    FILE* fp;
    int cols = 6;
    int *vec_1 = malloc(sizeof(int)*cols);
    int *vec_2 = malloc(sizeof(int)*cols);
    int i, i1, i2;
    char ch;

    fp = fopen("vector.txt","r");

    for(i1 = 0; i1 < cols; ){
        fscanf(fp, "%d%c", &vec_1[i1++], &ch);//Format is limited. "num[ \t\n]"
        if(ch == '\n')
            break;
    }

    i2 = 0;
    while(1==fscanf(fp, "%d", &vec_2[i2])){
        if(++i2 == cols)
            break;
    }
    fclose(fp);
    printf("first  : ");
    for(i=0; i<i1; ++i)
        printf("%d ", vec_1[i]);
    printf("\n");
    printf("second : ");
    for(i=0; i<i2; ++i)
        printf("%d ", vec_2[i]);
    printf("\n");
    free(vec_1);
    free(vec_2);
    return 0;
}

【讨论】:

    【解决方案2】:

    任何时候数据都存储在中,最好考虑fgets()

    此解决方案适应 N 行和用户可选择的列宽

    #define MAX_INT_WIDTH (sizeof (int) * CHAR_BIT/3 + 3)
    
    int **Read_Lines_Of_Numbers(FILE* inf, size_t Expected_Row_Width) {
      int **Row = NULL;
      size_t RowCount = 0;
      size_t RowSize = 0;
      char buf[Expected_Row_Width * (MAX_INT_WIDTH + 1) + 2];
      while (fgets(buf, sizeof buf, inf) != NULL) {
        if (RowCount >= RowSize) {
          RowSize = (RowSize + 1) * 2; // Double size
          Row = realloc(Row, RowSize * sizeof *Row);  // OOM checking omitted
        }
        Row[RowCount] = calloc(Expected_Row_Width, sizeof *Row[RowCount]); // OOM checking omitted
        size_t i;
        char *p = buf;
        for (i = 0; i < Expected_Row_Width; i++) {
          int n;
          if (sscanf(p, "%d %n", &Row[RowCount][i], &n) != 1)
            break;
          p += n;
        }
        if (*p || i != Expected_Row_Width) { // Bad data on line
          free(Row);
          return NULL;
        }
        RowCount++;
      }
      Row = realloc(Row, (RowCount + 1) * sizeof *Row);  // OOM checking omitted
      Row[RowCount] = NULL;
      return Row;
    }
    
    int main(void) {
      FILE *inf = fopen("c:/tmp/vector.txt", "r");
      size_t Width = 4;
      int **Data = Read_Lines_Of_Numbers(inf, Width);
      fclose(inf);
    
      if (Data) {
        size_t i;
        for (i = 0; Data[i]; i++) {
          size_t j;
          for (j = 0; j < Width; j++) {
            printf(" %d", Data[i][j]);
          }
          fputc('\n', stdout);
        }
        free(Data);
      }
      return 0;
    }
    

    【讨论】:

      【解决方案3】:

      row 必须初始化为 6 并且可能 col 也可能,您可以使用以下二维数组。

      int main()
      {
          FILE* fp;
          int **vec;
          int row = 6, col = 6, i, j;
          vec = malloc(sizeof(int *)*row); // allocates space for each row
          for (i = 0; i < row; i++) {
           vec[i] = malloc(sizeof(int)*col); // now allocate space for each cell within a row
          }
          fp = fopen("vector.txt","r");
      
          for(i = 0; i < row; i++) {
           for (j=0; j < col; j++) {
             fscanf(fp, "%d", &vec[i][j]); // read ith row, jth col
           }
          }
      
          vec = malloc(sizeof(int *)*row);
          for (i = 0; i < row; i++) {
             free(vec[i]);
          }    
          free(vec);
          return 0;
      }
      

      【讨论】:

      • 1) new int[col]C 中不起作用。建议vec[i] = malloc(col * sizeof *vec[i]); 2)不清楚使用第二个vec = malloc(sizeof(int *)*row);
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-05-03
      • 1970-01-01
      • 1970-01-01
      • 2010-11-06
      • 1970-01-01
      • 2017-05-29
      • 1970-01-01
      相关资源
      最近更新 更多