读取文件的最后一行后C崩溃

时间:2014-10-23 03:16:44

标签: c crash

我一直致力于编写一个C程序,它将打开一个文件,扫描并将其内容存储到一个数组中,然后在指定的对之间进行比较。该参考文献是在一串dna中发现突变。

尝试读取文件的最后一行时,我的问题存在。如果我注释掉那一行一切正常,但当我尝试合并读取该行的函数时,程序崩溃。

这是我到目前为止所知道的,我知道它现在不是很有效但我还在学习

(带有星号的行表示注释掉的程序以运行程序)

infile = fopen ("sequences.txt", "r");
outfile = fopen ("mutations.txt", "w");

read_top_pair(infile ,top_pairs, 15);
read_top_pair(infile, bottom_pairs, 15);

read_top_pair(infile, top_pairs2, 6);
read_top_pair(infile, bottom_pairs2, 6);

print_dna_sequence (top_pairs, 15, bottom_pairs, 15);
print_dna_sequence(top_pairs2, 6, bottom_pairs2, 6);

read_top_pair(infile, sick_top_pairs, 15);
read_top_pair(infile, sick_bottom_pairs, 15);

read_top_pair(infile, sick_top_pairs2, 6);
//read_top_pair(infile, sick_bottom_pairs2, 6); ***********************

print_dna_sequence (sick_top_pairs, 15, sick_bottom_pairs, 15);
print_dna_sequence (sick_top_pairs2, 6, sick_bottom_pairs2, 6);

check_mutation(top_pairs, bottom_pairs, sick_top_pairs, sick_bottom_pairs, outfile);

return 0;

这是我正在调用的函数:

int read_top_pair (FILE *infile, char top_pairs[], int size_top_pairs)
{
    int index = 0, base = 0;
    do
    {
        fscanf (infile, "%c", &base);
        if (base != '\n')
        {
            top_pairs[index++] = base;
        }
    } while (base != '\n');
    size_top_pairs = index;

    return top_pairs[15];
}        

我无法弄清楚我的生活为什么不会包含那条线。任何帮助将不胜感激

谢谢!

1 个答案:

答案 0 :(得分:0)

您正在向top_pairs写入值而不检查您是否超出了size_top_pairs给出的大小。如前所述,如果sick_bottom_pairs2的​​大小很小,那么你就会遇到经典的缓冲区溢出。

如果这没有帮助,您可以尝试使用fgetc(..)而不是fscanf(..),因为我不能完全确定它是否正确处理文件结尾。

int read_top_pair (FILE *infile, char top_pairs[], int size_top_pairs)
{
    int index = 0, base = 0;

    do
    {
        //fscanf (infile, "%c", &base);
        base = fgetc(infile);
        if (base == EOF)
        {
            /* you've reached the end of infile */
            break;
        }

        if (base != '\n')
        {
            /* do this only if (index + 1) is less than size_top_pairs */
            top_pairs[index++] = base;
        }
    } while (base != '\n');
    size_top_pairs = index;

    return top_pairs[15];
}