分段错误,Idont知道原因

时间:2014-07-17 17:39:37

标签: c segmentation-fault stdio

我实际上尝试生成并填充随机矩阵并将其保存为纯文本txt,但是当我尝试生成超过1000个文件而不是相当于工作目录中的2000个文件时会出现问题。

我想了解它的原因和解决方案。

我使用gcc code.c编译此代码并使用./a.out;运行,可能会更改第25行中生成的矩阵数:

cant = 1000; // THIS GENERATE 1000 FILES OF CURRENT MATRIX.

code.c:


解!!! = d

感谢Chistopher和Vallabh

对我来说,错误是对行的疏忽

关闭(puntero_f); 关闭(puntero_b);

非常感谢你的解释,我想我会在关于文件的更清晰的概念之后得到它们。

最终被理解为邮政编码,所以我为那些可能在将来有用的人留下了解决方案

非常感谢你;)


#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

//  Usando Preprocesado para manejar las matrices y tener acceso eficiente a memoria
    #define F(i,j) F[i*col +j]  
    #define B(i,j) B[i*col +j]

float randfloat(float min, float max){    
    return ((float) rand() / (float) RAND_MAX);   
}

int i, j, tstep, fil, col, cant;

int main(int argc, char *argv[]){

    char nombre_b[50] ;     //= "";
    char nombre_f[50] ;     //= "";      
    FILE *puntero_f;
    FILE *puntero_b;

    fil = 2;
    col = 2;
    cant = 1000;

    int tam = fil*col;
    float *F = calloc(tam,sizeof(float));
    float *B = calloc(tam,sizeof(float));

    //srand((unsigned)time(NULL));

    int archi = 0;
    for (tstep=0; tstep<cant; tstep++){

        sprintf(nombre_f, "Forward%d.txt", tstep);
        sprintf(nombre_b, "Backward%d.txt", tstep);
        puntero_f = fopen(nombre_f, "a+");
        puntero_b = fopen(nombre_b, "a+");

        for(i = 0; i<fil; i++){
            for(j = 0; j<col; j++){
                F(i,j) = randfloat(0.0f, 1.0f);
                B(i,j)  = randfloat(0.0f, 1.0f);

                if(tstep==archi){
                    fprintf(puntero_f,"%f ", F(i,j));
                    fprintf(puntero_b,"%f ", B(i,j));
                }
            }
            if(tstep==archi){
                fprintf(puntero_f,"\n");
                fprintf(puntero_b,"\n");
            }
        }
        archi++;
        fclose(puntero_f);
        fclose(puntero_b);
    }

    return 0;
}

此时出现了一个问题,即生成的文件超过1000个?

txt只生成Foward999.txt?文件?

2 个答案:

答案 0 :(得分:1)

问题是对close()的调用。如果您fopen()使用fclose()。

open()/ close()使用整数的文件描述符

fopen()/ fclose()使用FILE *。

你的代码中的问题是poitners可以转换为int,所以代码编译,但结果是崩溃!我用fclose()编译你的代码,它完美地工作。

答案 1 :(得分:0)

您不应将fopen()close()open()fclose()

一起使用

在代码中使用close()

代替fclose()

fopen()返回FILE指针,close()需要文件描述符进行操作。

如@christopher close()/open()所示

处理文件描述符,而fopen()/fclose()处理FILE指针。