以下是该方案。我在文件中有一个矩阵,其中包含数字和字母x。 x表示没有路径发生。我试图读取一个文件并将其存储在一个int数组中。但它不能很好地运作。 x的值不会改为99999。
graph.txt
0 x x x x x
x 0 x x x x
x x 0 x x x
x x x 0 x x
x x x x 0 x
x x x x x 0
this is the result.
0 2291852 1988293161 5507688 2291916 1988315945
3 1988315897 1238539516 3 1988897120 0
3 0 1988897120 2291908 1988273218 5508800
2291920 1988293445 19 2291976 1988390633 1988897120
1988390584 1238539576 2293452 0 2293256 2291936
1988339419 2293700 1988398293 1064569584 160 0
这是代码
# define x 99999
int main(){
char filename[200]="";
char buffer[200];
int ch;
FILE * fileIn;
FILE * fileInn;
printf("\tEnter Filename> ");
scanf("%s", &filename); //Enter filename
if((fileIn = fopen(filename, "r")) == NULL) { //error filename
printf("File could not be opened. \n");}
else {
while(!feof(fileIn)){ //counts number of rows
ch = fgetc(fileIn);
if(ch == '\n') size+=1;
}
rewind(fileIn);
if(!(feof(fileIn))){ //puts the matrix in an array
int input[size][size];
for(a = 0; a<size; a++) {
for(b=0; b<size; b++) {
fscanf(fileIn, "%d", &input[a][b]);
}
}
printMatrix(input);
}else printf("EOF");
}
}
当矩阵元素为x时,我想要发生的是。 x将被读取为99999并将其存储在输入数组中。如果它是一个整数,它将直接存储在输入数组中。
答案 0 :(得分:3)
有许多方法可以从文件中读取数组。您的挑战增加了一个简单的复杂功能,您必须从文件中读取字符和整数,然后根据字符是否代表数字或是否是单个字符来将元素添加到数组中。 X&#39;然后你将其替换为值&#39; 99999&#39;。
最简单的方法是使用面向行的输入从数据文件中一次读取一行,然后根据需要解析每一行。我建议您与getline
交朋友,以满足您的所有线路输入需求。与fgets
或scanf
相比,它提供了许多好处,并且不会比其他任何一项更省力。
从输入中读取数据行后,需要将行拆分为单词。 strtok
是首选工具,否则您可以编写自定义解析器(根据您的需要)。 strtok
在这里运作正常。将行拆分为单词时,可以测试每个单词以确定它们是代表数字还是字符。有很多方法可以做到这一点。在您的情况下,一种简单/有效的方法就是测试第一个字符是否为'x'
。如果是,请用99999
替换数组值,如果没有,只需使用atoi (word)
将单词转换为整数。
以下是完成上述所有操作的一个方法。如果您有任何问题,请仔细阅读并告诉我。
oops最初有&#39; 9999&#39;而不是&#39; 99999&#39; - 已修复
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_SIZE 1024
int main (int argc, char **argv) {
if (argc < 2) {
fprintf (stderr, "Error: insufficient input. Usage: %s input_file\n", argv[0]);
return 1;
}
char *line = NULL; /* forces getline to allocate space for buf */
ssize_t read = 0; /* number of characters read by getline */
size_t n = 0; /* limit number of chars to 'n', 0 no limit */
int idx = 0; /* simple index counter for array */
int row = 0; /* simple row counter index for array */
int *col = NULL; /* simple column counter for array */
int *array = NULL; /* array to hold integers read from file */
char *delim = " \n"; /* delimeter for strtok to parse line */
FILE *ifp = fopen(argv[1],"r");
if (!ifp)
{
fprintf(stderr, "\nerror: failed to open file: '%s'\n\n", argv[1]);
return 1;
}
array = calloc (MAX_SIZE, sizeof (array)); /* allocate MAX_SIZE elements */
col = calloc (MAX_SIZE, sizeof (col)); /* allocate MAX_SIZE elements */
while ((read = getline (&line, &n, ifp)) != -1) /* read each line in file with getline */
{
char *tmp = NULL; /* pointer to hold strtok results */
tmp = strtok (line, delim); /* first call to strtok using 'line' */
if (*tmp == 'x') /* test if tmp[0] = 'x' */
array [idx++] = 99999; /* if so, assign value of '99999' */
else
array [idx++] = atoi (tmp); /* if not, assign result of atoi (tmp) */
col[row]++; /* increase column count */
while ((tmp = strtok (NULL, delim)) != NULL) /* all remaining strtok calls use NULL */
{
if (*tmp == 'x') /* same tests as above */
array [idx++] = 99999;
else
array [idx++] = atoi (tmp);
col[row]++; /* increase column count */
}
row++; /* increase row count */
}
if (line) free (line); /* free memory allocated by getline */
int it = 0; /* simple index iterator */
while (col[it]) /* simple loop to validate columns */
{
if (it > 0)
if (col[it-1] != col[it])
{
fprintf (stderr, "Error: inconsistent colums of data read\n");
return 0;
}
it++;
}
printf ("\nProperties of array read from file '%s':\n\n", argv[1]);
printf (" elements: %d\n rows : %d\n cols : %d\n", idx, row, col[0]);
printf ("\nArray elements:\n\n");
for (it = 0; it < idx; it++) /* output information stored in array */
{
if ((it+1) % col[0] == 0 && it > 0)
printf (" %5d\n", array[it]);
else
printf (" %5d", array[it]);
}
printf ("\n");
if (array) free (array); /* free memory allocated to arrays */
if (col) free (col);
return 0;
}
输入文件:
$ cat dat/graph.txt
0 x x x x x
x 0 x x x x
x x 0 x x x
x x x 0 x x
x x x x 0 x
x x x x x 0
<强>输出:强>
$ /bin/rgraph dat/graph.txt
Properties of array read from file 'dat/graph.txt':
elements: 36
rows : 6
cols : 6
Array elements:
0 99999 99999 99999 99999 99999
99999 0 99999 99999 99999 99999
99999 99999 0 99999 99999 99999
99999 99999 99999 0 99999 99999
99999 99999 99999 99999 0 99999
99999 99999 99999 99999 99999 0
答案 1 :(得分:0)
#define x 99999
告诉编译器将符号x
视为程序中的值99999 ;它对如何处理从文件中读取的字符没有影响。
由于您明确告诉fscanf
您希望读取一个整数,因此没有理由期望它合理(因为您只是骗了它)。
可以做的事情在每个符号中作为字符串读取,如果是x
,则执行适合您的程序的任何操作;您可以使用atoi
sscanf
之类的实用程序来处理那些实际上是整数的实用程序。