我最近开始使用文件,但我遇到了错误。我有一个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);
}
一直在这里研究,但没有发现任何可以解决我的问题。 在此先感谢,我希望我能清楚地解释这个问题。
答案 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'
因为这种情况不正确,所以总是很满意。稍后在if
块strtok
内部返回null,因为空行中没有管道符号。如此有效,您将null传递给导致程序崩溃的strcpy
函数。