如何通过输入重定向输入不同的数据类型?

时间:2014-11-18 05:09:12

标签: c multidimensional-array io-redirection

我在C中使用输入重定向绕过我的头部有点麻烦。我正在制作扫雷程序,它接收扫雷场并计算每个方块周围有多少炸弹。就像在游戏中一样。

以下是一个例子:

a * =炸弹 一个 。 =安全空间

* . . .
. . * .
. . . .

会像这样出来的程序:

* 2 1 1
1 2 * 1
0 1 1 1

因此。关于问题

我试图让我的程序从命令提示符Ex:

获得输入
./a.out < someFile.txt

但我无法弄清楚如何正确阅读此文件。 该文件看起来像这样:

10 10
*.*.*.*.*.
.*.*.*.*.*
*.*.*.*.*.
.*.*.*.*.*
**********
.*.*.*.*.*
**********
.*.*.*.*.*
*.*.*.*.*.
.*.*.*.*.*

第一行由两个整数组成,表示后面的网格大小。 然后,网格及其所有部分进入。那么我如何从文件中正确输入这些数字/字符。这就是我所拥有的。

    int i;
int j;
int xSize;
int ySize;
char tempChar;




xSize = fgetc(stdin); 

ySize = fgetc(stdin);    


for (i = 0; i < ySize; i++){
    for(j = 0; j < xSize; j++){

           tempChar = fgetc(stdin); 
           if(tempChar != '\n'){           // make sure it's not a newline char
           gridArray[j][i] = tempChar;// grid array is an array of chars 
        }
    }
}

程序只会读入1和0作为第一行的输入,而不是10 10.而其余的都是乱码并且位置错误。谢谢你的帮助。

2 个答案:

答案 0 :(得分:1)

...问题

xSize = fgetc(stdin); // Returns 1. The stream is now "0 10....."
ySize = fgetc(stdin); // Returns 0. The stream is now " 10....."

您可以使用fscanf来读取数字,然后跳过所有内容直到行尾。

fscanf("%d %d %[^\n]*", &xSize, &ySize);
              // Format specifier for skipping until '\n'

现在阅读'\n'并弃掉它。

fgetc();

答案 1 :(得分:0)

只需使用fscanf也可以做到所期望的事情。

尝试使用以下代码

    #include<stdio.h>

    main()
    {

    FILE *fp;
    int i,j;
    int a,b;
    char array[20][20],ch;
    fp=fopen("file.txt","r");
    fscanf(fp,"%d %d",&a,&b);
    printf("a=%d b=%d\n",a,b);
    for(i=0;i<a;i++){
    for(j=0;j<b;j++){
    fscanf(fp,"%c",&ch);
    if(ch!='\n'){
    array[i][j]=ch;
    }
    else{
    --j;
    }
    }
    }

    for(i=0;i<a;i++){
    for(j=0;j<b;j++){
    printf("%c ",array[i][j]);
    }
    printf("\n");
    }
    }

我的文件file.txt包含

等内容
   3 10
   asdfggfdsa
   zxcvbmnbvc
   abcdefghij

仅供查阅,我保留信件。你可以保留* / .你想要的任何角色。

输出

      :~$ ./a.out 
      a=3 b=10
      a s d f g g f d s a 
      z x c v b m n b v c 
      a b c d e f g h i j 
      :~$

(在printf函数中,我给出了空格,这就是为什么字母之间存在空格)