C语言 如何从文件中读取多个问题?

vngu2lb8  于 2022-12-02  发布在  其他
关注(0)|答案(2)|浏览(163)

我必须读取一个txt文件,其中第一行描述了问题。它可以是a或b,然后我有一些int和as矩阵。我的程序对两者都有效,但有些文件在第一个问题之后可能会有另一个相同格式的文件。我不知道如何做到这一点。
文本示例:

5 5 A(B) 1 
0 3 (start point)´
1 5 6 5 9
5 8 6 3 1
8 6 9 5 3 
5 6 9 3 0
2 3 9 3 8

那么这种格式的另一个或更多问题

while(!feof(fp)){
  fscanf(fp, "%d %d %c %d", &L, &C, &variante, &pontos);

  mapa=(int **)malloc(L*sizeof(int*));
  for(i=0; i<L; i++){
    mapa[i]=(int*)malloc(C*sizeof(int));
  }
  for(i=0; i<L; i++){
    for(j=0; j<C; j++){
      mapa[i][j]=0;
    }
  }

  if(variante == 'A') {
    fscanf(fp, "%d %d", &Linit, &cinit);
    for(i=0; i<L; i++){
      for(j=0; j<C; j++){
        fscanf(fp, "%d", &mapa[i][j]);
        printf("%d-", mapa[i][j]);
      }

      printf("\n");
    }
    possivel=varianteA(mapa, L, C, Linit, cinit, &custo);
    printf("%d\n",custo);
  }
  if(variante== 'B'){
    line=(int*)malloc(pontos*sizeof(int));
    col=(int*)malloc(pontos*sizeof(int));
    for(k=0; k<pontos; k++){
      line[k]=0;
      col[k]=0;
    }
    for(k=0; k<pontos; k++){
      fscanf(fp, "%d %d", &line[k], &col[k]);
    }
    for(i=0; i<L; i++){
      for(j=0; j<C; j++){
        fscanf(fp, "%d", &mapa[i][j]);
        printf("%d-", mapa[i][j]);
      }
      printf("\n");
    }
      possivel=varianteB(mapa, L, C, &custo, pontos, line, col);
      printf("%d %d\n", possivel, custo);
      free(line);
      free(col);
  }

  for(i=0; i<L; i++){
    int *linha;
    linha=mapa[i];
    free(linha);
  }
  free(mapa);
}
//  free(variante);
  fclose(fp);

现在我有这个,但它做了一个更多的问题,是不在文件中。和valgrind给我一个错误:possivel=varianteA(..).它表示在分配了大小为24的块后,地址为0字节

bzzcjhmw

bzzcjhmw1#

当处理这类问题(或者任何编程任务,真的)时,写一些 * 伪代码 * 通常是有益的,只是用文字描述程序需要做什么。
执行问题

  • 开启档案
  • 当文件具有剩余内容时
  • 读一行文本
  • 从该行中提取宽度
  • 从该行中提取height
  • 从该行中提取问题类型“A”或“B”
  • 如果问题类型为“A”
  • 从行中提取**???**最后一个数字
  • 如果问题类型为“B”
  • 从该行中提取剩余的2+个数字
  • 读一行文本
  • 从该行中提取start-point-x
  • 从该行中提取start-point-y
  • 从文件中读取高度行文本
  • 对于每一行,提取array_data宽度数字
  • 读空白行

(EDIT:看起来好像我已经将缩进级别设置到了最大值,但您应该明白了)
所以现在问题被分解成更小的,希望更容易管理的问题。

xpszyzbs

xpszyzbs2#

下面是一些sudo代码示例,说明如何构建你的程序。你将不得不进行大量修改,但你说你只需要阅读第二个问题。

#define MAX_SIZE (100) //or whatever it is
#define UNIQUE_IDENTIFIER "=" //or whatever it is

FILE * fp = NULL;
int problem_counter = 0;
char * line = malloc(sizeof(char)*MAX_SIZE);

if(!(fp = fopen("problem.txt","r"))){
  do_error_handling();
}

do{
printf("This is the %dth problem", ++problem_counter); //dont need to printf this but you can start counting here.
if(fgets(line,MAX_SIZE,fp) == NULL){
  break;
}
if(strstr(line,UNIQUE_IDENTIFIER){
  //start of problem.  maybe read in all the lines here and build up the problem you have to solve
  read_problem(line); //does special stuff based of the first line read
  solve_problem(); //solve the problem based on the stuff you extracted from reading the problem
}
while(!feof(fp));

相关问题