为什么我的fscanf不读?

时间:2013-05-10 06:10:02

标签: c debugging scanf

我必须编写一个程序,在整数的三角形迷宫中找到最大值的路径。

  • 此程序应计算从顶部开始到底部某处的路线上传递的最高数字总和。
  • 每一步都可以向左斜下方或向右斜下方。
  • 三角形中的行数> 1但是< = 100。
  • 三角形中的数字,所有整数,介于0和99之间。

我的fscanf功能有问题。由于某种原因,它不会读取。我非常感谢任何帮助或建议,因为这个项目应该尽快到期。

这是一个迷宫的例子:

  

30

     

47 1

     

35 65 21

     

0 74 94 58

     

71 29 34 28 60

     

97 6 29 19 26 68

     

37 1 48 98 57 89 64

     

60 38 33 23 49 57 19 50

     

4 83 52 47 84 60 16 56 90

     

19 59 6 10 97 47 96 93 59 50

这是我到目前为止所得到的:

/#include <stdio.h>
/#include <stdlib.h>
/#define MAX 100

void read    (int maze [][MAX]);
int findPath (int maze[][MAX], int map[][MAX], int size);
void print   (int map [][MAX]);

int main()
{
    int maze [][MAX] = {};
    int map  [][MAX] = {};

    int sum = 0;
    int size = MAX;

    read     (maze);
    findPath (maze, map,size);
    print    (map);

    return;
}

void read (int maze[][MAX])
{
    FILE * mazeFile;
    int num, r, c, count;

    if ((mazeFile = fopen ("t4.txt", "r")) == NULL)
    {
        printf ("Error opening a file\n");
    }
    else
    {
        while (mazeFile != EOF)
        {        
            fscanf (mazeFile, "%d", &maze[r][c]);

            for (r = 0; r < 100 ; r++)
            {
                count = r + 1;
                for (c = 0; c <= count; c++)
                {
                    printf ("(%d, %d) = %d\n",r, c, maze[r][c]);
                }
            }
            fclose (mazeFile);
            return;
        }
    }
}

int findPath (int maze[][MAX], int map[][MAX], int size)
{
    int sum [MAX][MAX] = {0};
    int row, col, maxNum;

    for(row=(size-1); row >= 1; --row)
    {
        for (col-row;col>=1;--col)
        {
            maxNum = (sum[row+1][col] > sum [row+1][col+1] ? col : col + 1);
            sum[row][col]= maze[row][col] + sum [row+1][maxNum];

            map[row][col] = maxNum;
        }
    }  
    return sum [0][0];
}

void print (int map [][MAX])
{
    printf ("(%d, %d) = ", map[0][0], map[0][1]);
    return;
}

1 个答案:

答案 0 :(得分:3)

嗯:-)有很多问题,但你问的问题是阅读文件,所以我现在就解决这个问题:

一些更正

  • 首先不要使用readwrite,因为它们是标准库函数,会遇到很多问题;
  • 不要将void用作函数的返回类型,使用int并在成功和否定时返回0 失败的数字(这是常规的)并帮助您编写捕获错误的代码
  • 请使用注释来描述您的功能
  • 标签很好,至少有4个空格(我是内核程序员,所以我喜欢8空格标签) 当你在凌晨2:30昏昏欲睡并试图找出答案时,他们会提供帮助
  • 函数内的所有语句都应该被选中,而不是与{}
  • 对齐
  • 一个好的约定是在换行时使用open {仅用于函数体和其余部分 如如果 等,{应与声明位于同一行,并且结束}应与第一个字母对齐声明。
  • 不要在每个语句之间放置太多空格。它使代码的可读性降低。

良好方法的例子

以下是如何正确编码文件的代码示例。

第1步:

创建一个简单的函数,只读取内容并将其转储回来,以便您知道您的READING正常。

#include <stdio.h>

/** 
 * @function: read_maze
 * @desc: Reads a maze file and dumps it to stdout, 
 * @return: Returns 0 on success, -1 on failure
 *
 */

int read_maze(const char *filename) 
{
     FILE *fp;
     int entry;

     fp = fopen(filename, "r");
     if ( !fp ) {
          perror(filename); /* prints system error related to
                             * the problem reading mazefile 
                             */
          return -1;
     }

     while(!feof(fp)) {
          if (fscanf(fp, "%d", &entry) == 1) { 
              printf ("%d\n", entry);
          }
     }

     return 0;
}

int main()
{
     if(read_maze("t4.txt")) {
          return -1;
     }

     return 0;
}

第2步:

创建一个有意义的三角形迷宫阵列:

好的,现在我们知道我们可以正确读取文件,让我们尝试将其放入一个有意义的结构中。

我们知道我们有一堆行(100),第一行有1列,第二行有2,第3行有3 ......等等...

换句话说,每一行的基数与其基数(索引+ 1)相同;

以下是什么?

int row0[1];
int row1[2];
int row2[3];
   .
   .
   .
int row99[100]; 

这有点难看,而不是真正的程序化;自动这样做会很好; 我们知道固定数是行数,动态分配与索引相关联。所以让我们创建一个指向整数的指针数组;然后,这个数组的每个成员都可以是一个动态分配的内存块,就像成员的基数一样大。 (嘴里嘿嘿)

#define MAXROWS 100

int *row[MAXROWS]; 

注意:从概念上讲,MAXROWS实际上对应于我们在单词row前面的硬编码0-99而不是括号中的数组大小的声明片段。所以int row55[56];这就是宣告55; 56声明将来自malloc;

现在我们知道指向数据类型的指针就是这样一个指向POINT到内存的指针阻塞我们的数据(基本上充当数组)换句话说让我们为每一行分配适当的列:

 /* starting from beginning */

 #define MAXROWS 100

 int *rows[MAXROWS];

 int init_triangular_array() 
 {
     int k;
     memset(rows, 0, sizeof(int *)*MAXROWS); /* make the rows array all zeros */
     for (k = 0; k < MAXROWS; k++) {
         rows[k] = (int *)calloc(k+1, sizeof(int)); /* cardinality */
         if( rows[k] == NULL ) {
              fprintf(stderr, "Unable to allocate memory, quoting\n");
              exit(-1); /* just kill the program */
         }
     }
 }

现在我们有了一个初始化数组的函数......让我们创建一个函数来完成数组的释放;因为那只是很好的编码实践。

 void free_triangular_array()
 {
     int k;
     for (k = 0; k  < MAXROWS; k++ ) {
         if ( rows[k] ) 
              free(rows[k]);
     }
 }

现在让我们编写一个函数来填充我们的文件:

 int fill_triangular_array(const char *filename)
 {

       FILE *fp = fopen(...);
       int row = 0, col = 0;

       while(!feof(fp)) {
             for (col = 0; col <= row_number; col++ ) {
                   // read an entry as above 
                   rows[row][col] = entry; 
             }
       }
 }

你可以填补缺失的部分。

现在你已经完成了所有这一切

 int main() 
 {

         init_triangular_array();
         fill_triangular_array();
         /* do something with the array */
         free_triangular_array();

 }