0

我在读取和写入文件时遇到问题。我正在读取数据input.txt,计算(Bytelandian 问题)并将结果写入文件。

如果我删除代码的最后一部分,

    /*
    for ( input_counter=0; input_counter<no_of_cases; input_counter++)
    {
        sprintf(buffer, "%d", max[input_counter]);
    fputs(buffer, fw);                
    }   
    fclose(fw);
    */

一切正常(除了我无法写入文件)。但我能够编译和运行代码。

但是,在包含该代码时,我收到错误“分段错误(核心转储)”。知道会发生什么吗?

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

    int Calculate_max (int number){
        int counter;
        int store[number+1];
        store[0] = 0;
        if (number>=1){
            store[1] = 1;
        }
        if (number>=2){
            store[2] = 2;
        }

        for (counter=3; counter<=number; counter++){
            store[counter] = store [counter/2] +store[counter/3]+store[counter/4];
            if (store[counter]<counter){
               store[counter]=counter;
            } 
        }
        return store[number];
    }

    int main(void){
        int no_of_cases=0;
        int number[10];
        int max[10];
        int input_counter=0;
        char line [ 128 ];
        char buffer [ 16 ];
        FILE *fr= fopen ("input.txt", "rt");            /* declare the file pointer */
        FILE *fw= fopen ("output.txt", "W+");           /* declare the file pointer */
        if ( fr != NULL )
        {
            if ( fgets ( line, sizeof line, fr ) != NULL ) /* read a line */
        {   
            no_of_cases = atoi (line);
            //printf("no %d \n", no_of_cases);
        }       
        if (no_of_cases==0)
        {
            printf("No Cases!!");
        }
        else 
        {
            for ( input_counter=0; input_counter<no_of_cases; input_counter++)
            {
                if ( fgets ( line, sizeof line, fr ) != NULL ) 
            {
                number[input_counter] = atoi (line);
                //scanf (line, number[input_counter], "%d");
                //printf(" %s \n " , line);
                //fputs ( line, stdout ); 
            }              
            max[input_counter]= Calculate_max(number[input_counter]);
            //fwrite(max[input_counter],sizeof(int),1,fp);          
            //fprintf(fw, "%d \n", max[input_counter]);                
            printf("%d \n", max[input_counter]);                
           }            
            }
        fclose(fr); 
        }   
        /*
        for ( input_counter=0; input_counter<no_of_cases; input_counter++)
        {
            sprintf(buffer, "%d", max[input_counter]);
        fputs(buffer, fw);                
        }   
        fclose(fw);
        */
    return 0;
    }

新代码:

    #include<stdio.h>  
    #include <cstdlib>  
    long long Calculate_max ( long long number)
    {
    long long counter;
    long long store[number+1];
    store[0] = 0;
    if (number>=1){
        store[1] = 1;
    }
    if (number>=2){
        store[2] = 2;
    }
    for (counter=3; counter<=number; counter++){
        store[counter] = store [counter/2] +store[counter/3]+store[counter/4];
        if (store[counter]<counter){
            store[counter]=counter;
        }
    }
    return store[number];
    }         
    int main(void)
    {
    int no_of_cases=10;
    long long number;
    long long max[10];
int input_counter=0;
char line [128];
char buffer [ 64 ];
FILE *fr= fopen ("input.txt", "rt");            /* declare the file pointer */
FILE *fw= fopen ("output.txt", "w+");           /* declare the file pointer */
if ( fr != NULL )
{   
    while ( fgets ( line, sizeof line, fr ) != NULL ) 
        {
            //number= atoll (line);
            number=1000000000;              
            max[input_counter]= Calculate_max(number);
            input_counter++;
            printf("test \n");
        }              
    fclose(fr);
}   
printf("writing \n");
no_of_cases=input_counter;
for ( input_counter=0; input_counter<no_of_cases; input_counter++)
{
    sprintf(buffer, "%lld", max[input_counter]);        
    fputs(buffer, fw);                
    fputs("\n", fw);                
}   
fclose(fw); 
return 0;
    }
4

2 回答 2

4

你真的应该在这里使用调试器,它会准确地告诉你哪一行代码正在崩溃。

我怀疑您的问题是fw无法打开输出文件,因此调用fputs(buffer, NULL)崩溃了。您应该检查以确保文件已成功打开,如果没有,请相应地退出。它可能无法打开,因为您传递了无效的模式字符串"W+".

试试"w"(小写w,而不是大写),因为你只需要写访问,你不需要读写访问(如果你这样做,请"w+"改用)。

于 2012-09-19T17:10:05.337 回答
3

编辑:您的新代码store[0] = 0Calculate_max()函数中失败,因为您number包含的值太大而无法long longs在堆栈上创建该大小的数组。

正如亚当在他的回答中建议的那样,您应该使用调试器来帮助您确定代码导致问题的位置。我已经为你做了这个,所以你可以看到它是如何完成的。希望你会发现这很有用。

这是一个使用GDB. 您将在第 69 行看到分段错误:

fclose(fw);

修复方法是使用以下行打开文件:

FILE *fw= fopen ("output.txt", "w+");

注意 w 现在是小写的。

[jrn@localhost ~]$ gcc -ggdb boom.c -o boom
[jrn@localhost ~]$ gdb boom
Reading symbols from /home/jrn/boom...done.
(gdb) run
Starting program: /home/jrn/boom 

Program received signal SIGSEGV, Segmentation fault.
0x00c0660d in fclose@@GLIBC_2.1 () from /lib/libc.so.6
(gdb) bt
#0  0x00c0660d in fclose@@GLIBC_2.1 () from /lib/libc.so.6
#1  0x08048759 in main () at boom.c:69
于 2012-09-19T18:26:43.113 回答