1

我创建了一个文件指针数组并获得了核心转储。如果我将所有内容都写入一个文件,那么我的程序就可以正常工作。这是什么原因?

这行得通。

unsigned char error_array[4][4][256]
FILE *hypo_table;
hypo_table = fopen("00.txt", "w");
for(i = 0; i < 4; i++) {
    for(j = 0; j < 4; j++) {
        for(hypo_key = 0; hypo_key < 256; hypo_key++) {
            //process error_array
            fprintf(hypo_table, "%.2x ", error_array[i][j][hypo_key]);
            if(hypo_key == 255)
                break;

这不起作用(核心转储)。

unsigned char error_array[4][4][256]
FILE *hypo_table[4][4];
hypo_table[0][0] = fopen("00.txt", "w");
hypo_table[1][0] = fopen("10.txt", "w");
hypo_table[2][0] = fopen("20.txt", "w");
hypo_table[3][0] = fopen("30.txt", "w");

hypo_table[1][0] = fopen("10.txt", "w");
hypo_table[1][1] = fopen("11.txt", "w");
hypo_table[1][2] = fopen("12.txt", "w");
hypo_table[1][3] = fopen("13.txt", "w");

hypo_table[2][0] = fopen("20.txt", "w");
hypo_table[2][1] = fopen("21.txt", "w");
hypo_table[2][2] = fopen("22.txt", "w");
hypo_table[2][3] = fopen("23.txt", "w");

hypo_table[3][0] = fopen("30.txt", "w");
hypo_table[3][1] = fopen("31.txt", "w");
hypo_table[3][2] = fopen("32.txt", "w");
hypo_table[3][3] = fopen("33.txt", "w");


for(i = 0; i < 4; i++) {
    for(j = 0; j < 4; j++) {
        for(hypo_key = 0; hypo_key < 256; hypo_key++) {
            //process error_array
            fprintf(hypo_table[i][j], "%.2x ", error_array[i][j][hypo_key]);
            if(hypo_key == 255)
                break;
4

3 回答 3

3

您正在做的错误是您在循环中使用未初始化的流。您打开相同的文件两次。但是您没有打开某些文件,也没有分配某些流

hypo_table[0][0] = fopen("00.txt", "w");

此处您没有打开文件 01.txt、、02.txt03.txt
hypo_table[0][1],hypo_table[0][2],hypo_table[0][3]不是有效的流

hypo_table[1][0] = fopen("10.txt", "w"); //Here ,it is 01 
hypo_table[2][0] = fopen("20.txt", "w"); //Here ,it is 02 
hypo_table[3][0] = fopen("30.txt", "w"); //Here ,it is 03

hypo_table[1][0] = fopen("10.txt", "w"); //Here You are reopening
hypo_table[1][1] = fopen("11.txt", "w");
hypo_table[1][2] = fopen("12.txt", "w");
hypo_table[1][3] = fopen("13.txt", "w");

for(i = 0; i < 4; i++) {
    for(j = 0; j < 4; j++) {
        for(hypo_key = 0; hypo_key < 256; hypo_key++) {
            //process error_array

在这里,您试图访问无效的流。这将给出段错误。

            fprintf(hypo_table[i][j], "%.2x ", error_array[i][j][hypo_key]);

使用循环打开文件并分配流并fopen()根据返回值检查返回值继续进行。

用于sprintf()创建文件名字符串。

FILE *hypo_table[4][4],*fp=NULL;
char buf[10];

    for(i = 0; i < 4; i++) {
        for(j = 0; j < 4; j++) {
               sprintf(buf,"%d%d.txt",i,j);    
               fp = fopen(buf, "w");
               if(fp!=NULL)
                  {
                  hypo_table[i][j] =fp;
                  //You can include inner loop Here
                  fp=NULL;  
                  }    
               else
                  {
                  perror("ERROR");
                  //Handle As you want or simply exit. 
                  } 
               }
          }
于 2013-09-28T20:00:59.453 回答
2

您应该认识到 fopen 可能会失败的事实。进程可以打开的文件数量可以有上限。

如果 fopen 失败,则返回 NULL。

如果它返回 NULL,fprintf 将访问违反

hypo_table[3][3] = fopen("33.txt", "w");  assert(hypo_table[3][3] != NULL);

如果您为其中的每一个都扔断言,您将看到哪个失败了。您需要 #include 才能使用 assert 函数。

通常,当您打开文件时,您应该遵循以下模式:

FILE *fp = fopen("some_file.txt", "rw");
if (fp != NULL)
{
    /* Do file stuff */

    fclose(fp);
}
else
{
    printf("golly gee wilkers, the file didn't open\n");
    /* and maybe look at the errno variable to figure out why */
}
于 2013-09-28T19:30:41.127 回答
0

1) 没有理由不能同时打开 16 个文件。

2)你的二维数组hypo_table看起来不错。

3) 我们对您的 3 天阵列一无所知error_array。我怀疑这就是你的问题所在。

4) 你绝对应该检查所有可能的错误情况——比如“fopen()”失败。

5)您绝对应该在调试器下逐步执行代码 - 这将帮助您准确确定失败的位置以及原因

于 2013-09-28T19:33:49.063 回答