C 编程 - fgets() 无限 while 循环

标签 c while-loop fgets file-read

我在从文本文件中获取增强矩阵时遇到问题。成功读取文本文件中的所有数据后,程序将简单地出现段错误,很可能是因为它仍在寻找另一个要到达的标记,或者 fgets() 没有达到 NULL 状态?老实说我迷路了...

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include "apmatrix.h"
#define NUMARGS 2 
#define BUFSIZE 128

int main (int argc, char *argv[]) 
{ 
    /* Matrices that will always be used */
    Matrix* A;
    Vector* b;
    Vector* x;
    iVector* p;

    /* Used in LU factorization */
    Matrix* L;
    Matrix* U;

    /* Standard character read-in variables needed */
    char sep[] = " "; /* parsing separator is space */
    char *z,*buffer;  /* buffer and pointer to scan buffer */
    FILE *ifp;        /* source file */ 
    unsigned buflen;  /* length of line read */
    int flag, count;
    int Rows,Columns;/* to hold number read */
    int CurrentRow=0;

    /* first check to see if have required number for argc */ 
    /* if not, error has occurred, don't do anything else */ 
    if (argc == 2 || argc==3) 
    { 
        /* correct number of arguments used, try to open both files */ 
        buffer = (char*) malloc(BUFSIZE); /* allocate buffer */
        ifp = fopen (argv[1], "r");  /* open file for reading */ 

        if (ifp && buffer) { /* if successful proceed */
            /* read file line by line */
            flag=0;
            while (fgets(buffer, BUFSIZE, ifp) != NULL) {       
                /* defensive/secure programming */
                buflen = strlen(buffer);
                /* parse line */            
                z = strtok(buffer,sep);

                /* take in the values of the rows and columns */
                if(flag == 0){
                    ++flag;                 /* Flag = 1 */

                    Rows = atoi(z);         /* Convert the string to double */
                    printf("  %d",Rows);
                    z = strtok(NULL, sep);  /* find next number */
                    Columns = atoi(z);      /* Convert the string to double */           
                    printf("  %d",Columns);
                    putchar('\n');

                    A = m_alloc(Rows,Columns);
                    b = v_alloc(Rows);
                    x = v_alloc(Rows);
                    p = iv_alloc(Rows);

                    L = m_alloc(Rows,Columns);
                    U = m_alloc(Rows,Columns);
                }
                /* take in the values of the matrices */
                else{

                    for(int i = 0; i < Rows; i++){
                        A->mat[CurrentRow][i] = (Real) atof(z);             /* Convert the string to an int*/
                        z = strtok(NULL, sep);  /* find next number */
                        printf("   %2.3f   ",A->mat[CurrentRow][i]);
                    }

                    b->vec[CurrentRow] = (Real) atof(z);            /* Convert the string to an int */
                    printf("   %2.3f   ",b->vec[CurrentRow]);           
                    putchar('\n');
                    CurrentRow++;
                    putchar('\n');
                }

            } 
            fclose (ifp); 

...

我没有打印其余的代码,因为我认为它与手头的问题无关。我想知道为什么会出现这个问题以及如何在代码中修复它,因为稍后我将需要这些信息来解决程序中的 Ax=b 问题。文本文件为我提供了增广矩阵 [A|b],因此我使用 LU 分解求解 x。我认为这可能与缓冲区本身有关,但我对 C 编程也缺乏经验。

我正在阅读的文本文件也是这样写的......

 3 4
 2 1 1  1
 6 2 1 -7
-2 2 1  7 

这些是我从代码中得到的结果

  3  4
   2.000      1.000      1.000      1.000

   6.000      2.000      1.000      -7.000

   -2.000      2.000      1.000      7.000

Segmentation fault (core dumped)

感谢您的宝贵时间。 :)

更新:我尝试运行 gdb 进行调试,但一直坚持尝试使用文本文件运行核心转储。 (例如 ./hw6 ge1.txt 是我在命令行中输入的内容)。我如何使用文本文件运行它,因为没有它它就会出现段错误。

 c
Continuing.
Expecting two or three arguments
The second argument must be a text file to read from.
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400a4e in m_free (M=0x0) at apmatrix.c:32
32              free(M->mat[0]); /* free data */

最佳答案

1) compile your program with -ggdb parameter
2) link your program with the -ggdb parameter

这将生成一个包含最大量调试信息的可执行文件,供 gdb 调试器使用。

3) assure the source code is visible from where the program is to be run
   (in the same directory works very well)
4) at the command line: gdb yourProgramName
5) from within gdb enter the following commands
    br main    <-- sets breakpoint at main
    run        <-- execution program until breakpoint reached
    c          <-- continue execution
6) when the program crashes, enter the following commands
   bt          <-- display a back trace
7) examine the back trace to see which line your program crashed on.

8) quit y      <-- to exit the program
9) let us know which line that is.  
   paste/edit the line into your question
   as a line number would be meaningless to us.

关于C 编程 - fgets() 无限 while 循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29664431/

相关文章:

PHP 嵌套each/while

php - 从文件 PHP 中删除前 X 行

C: 如何让 sscanf 保留字符串前面的空格?

c - Fgets 错误 段错误

c - printf() 仍然有效,尽管缺少参数

c - 编译哪个阶段会报 "symbol defined multiple times"?

python while 和 if 与条件对

c++ - 如何将 "struct first_name"重命名为 "struct second_name"

c1 1's ' Generic' 关键字可以在 gcc _Static_assert 中使用吗

java - 哨兵控制循环以及如何打印多个字符串。初学者java编程