在C中读取标记时出现问题

在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) <

我似乎不知道如何正确读取具有以下外观的.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) < 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);