我在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.而其余的都是乱码并且位置错误。谢谢你的帮助。
答案 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
函数中,我给出了空格,这就是为什么字母之间存在空格)