读取空行时程序崩溃 - c

时间:2017-10-10 17:00:17

标签: c file

我最近开始使用文件,但我遇到了错误。我有一个txt。具有以下字符串的文件:

a|10

b|5

我的问题是当我读取空行时,即使我在代码中有条件,它也会以某种方式崩溃。调试时我可以看到该行收到" \ n"但是程序在这种情况下并没有识别它并且崩溃了。

void delete_prod(void)
{
FILE *pfile;
char line[21];
char *buffer;
char *ptr;
char produto_nome[21];
char produto_quantidade[21];

char quantidade_nova[21];
char teste[21];
char barra_linha[]="\n";

buffer = (char *) malloc(1000*sizeof(char));
memset(buffer, 0, 1000*sizeof(char));
ptr = buffer;

printf("material:");
scanf("%s",teste);

pfile = fopen("registos.txt", "r");

while(!feof(pfile))
{
    int i=0;
    for(i; i<21;i++)
    {
        line[i] = 0;
    }
    fgets(line, 21, pfile);
    if(line != NULL || line != "\n")
    {
        strcpy(produto_nome, strtok(line ,"|"));
        strcpy(produto_quantidade, strtok(NULL, "|"));

        if((strcmp(produto_nome,teste) == 0))
        {
            //DO THE REST OF THE WORK HERE
            printf("HERE");
        }
        else
        {
            printf("ERROR");
        }
    }
}
fclose(pfile);
}

一直在这里研究,但没有发现任何可以解决我的问题。 在此先感谢,我希望我能清楚地解释这个问题。

2 个答案:

答案 0 :(得分:2)

考虑所有输入的fgets strpbrk可用于查看该行是否包含| sscanf可以解析该行以查看是否有两个值。

void delete_prod(void)
{
    FILE *pfile;
    char line[21];
    char *buffer;
    char *ptr;
    char produto_nome[21];
    char produto_quantidade[21];

    char quantidade_nova[21];
    char teste[21];
    char barra_linha[]="\n";

    buffer = (char *) malloc(1000*sizeof(char));
    memset(buffer, 0, 1000*sizeof(char));
    ptr = buffer;

    printf("material:");
    fgets ( teste, sizeof teste, stdin);
    teste[strcspn ( teste, "\n")] = '\0';//remove newline

    pfile = fopen("registos.txt", "r");

    while( fgets ( line, sizeof line, pfile))
    {
        if( strpbrk ( line, "|"))//the line contains a |
        {
            //sscanf for two items
            result = sscanf ( line, "%20[^|]|%20s", procuto_nome, produto_quantidade);

            if(result == 2) {
                if((strcmp(produto_nome,teste) == 0))
                {
                    //DO THE REST OF THE WORK HERE
                    printf("HERE");
                }
                else
                {
                    printf("ERROR");
                }
            }
            else {
                printf ( "ERROR line did not contain two values\n");
            }
        }
        else {
            printf ( "ERROR line does not contain |\n");
        }
    }
    fclose(pfile);
}

答案 1 :(得分:1)

您检查空白行的条件未正确编码。

更改

line != "\n"

line[0] != '\n'

因为这种情况不正确,所以总是很满意。稍后在ifstrtok内部返回null,因为空行中没有管道符号。如此有效,您将null传递给导致程序崩溃的strcpy函数。