在C中读取标记时出现问题
我似乎不知道如何正确读取具有以下外观的.txt文件:(示例) 等等。。。 我现在需要的是存储运算符/标记,它可以是“+”-“p”或类似的东西,以及两个不同变量中的int,因为我需要稍后检查它们在C中读取标记时出现问题,c,C,我似乎不知道如何正确读取具有以下外观的.txt文件:(示例) 等等。。。 我现在需要的是存储运算符/标记,它可以是“+”-“p”或类似的东西,以及两个不同变量中的int,因为我需要稍后检查它们 char oprtr[1]; int value; FILE *fp = fopen(args[1], "r"); while(!feof(fp) && !ferror(fp)){ if(fscanf(fp, "%s %d\n", oprtr, &value) <
char oprtr[1];
int value;
FILE *fp = fopen(args[1], "r");
while(!feof(fp) && !ferror(fp)){
if(fscanf(fp, "%s %d\n", oprtr, &value) < 1){
printf("fscanf error\n");
}
if(strcmp(oprtr, "+") == 0){
function1(bst, value);
} else if(strcmp(oprtr, "-") == 0){
function2(bst, value);
} else if((strcmp(oprtr, "p") == 0) && value == -1){
function3(root);
//some other functions and so on...
}
char oprtr[1];
int值;
文件*fp=fopen(args[1],“r”);
而(!feof(fp)和&!feror(fp)){
如果(fscanf(fp,“%s%d\n”,oprtr,&value)<1){
printf(“fscanf错误\n”);
}
如果(strcmp(oprtr,“+”)==0){
功能1(bst,值);
}否则如果(strcmp(oprtr,“-”==0){
功能2(bst,值);
}否则如果((strcmp(oprtr,“p”)=0)和&value=-1){
功能3(根);
//其他一些功能等等。。。
}
打印出oprtr和循环中的值表明它们没有正确输入,但它确实可以编译。有人有解决方案吗?您的字符串
oprtr
太小,只能容纳空字符串(请记住,C字符串需要一个终止的0字符!)。因此:
需要至少:
char oprtr[2]; // string of maximum size 1
或者更具防御性:
char oprtr[256]; // string of maximum size 255
您有单个字符,可以使用
==
来比较它们,而不是strcmp
。只需成对读取输入,并使用开关,例如
char c;
int x;
while(fscanf(fp, "%c %d", &c, &x) == 2)
{ switch(c)
{ case '+': /* ... */
}
}
您可以使用fscanf函数,您可以从文件中获取输入
int fscanf(FILE *stream, const char *format, ...);
fscanf(fp," %c %d",&c,&d);
这比OP的代码好,但是如果一行有三个标记,那么它就会变得混乱。在fscanf()
调用中没有内在的内容,它说“读取这样格式化的行”。我假设输入格式正确,但你是对的。一般来说,输入可以是任何东西,需要进行一些更复杂的解析。我认为这不会像预期的那样起作用。在第二次迭代中,%c
会不会吞掉\n
字符?没有尝试过,但你可以将\n
添加到fscanf
如果发生这种情况。因为我的输入是标准化的,正如我在第一篇文章中提到的那样“%c%d\n”是一种方法!您对feof()
的使用是错误的,它不能这样工作。只有在I/O无法确定它是否由于达到EOF而失败时,您才能使用它。您不能用它来预测未来。
char c;
int x;
while(fscanf(fp, "%c %d", &c, &x) == 2)
{ switch(c)
{ case '+': /* ... */
}
}
int fscanf(FILE *stream, const char *format, ...);
fscanf(fp," %c %d",&c,&d);