0

我对 C 完全陌生,我正在开发一个程序,该程序必须从文本文件(两个数字和一个数学符号)中读取 3 行并写出结果。例如:

文本文件如下所示:

1

4

*

我的程序应该能够读取 3 行并写出类似“1 * 4 = 4”之类的东西。

我设法达到了可以读取 3 行并在屏幕上显示它们的地步,所以我想我应该将这两个数字放在一个数组中,将符号放在另一个数组中。问题是,我试图查看数组是否包含我放入其中的数字,而我的输出中有一些巨大的数字,我不知道为什么。

这是我写的代码:

#include <stdio.h>
#include <io.h>
#include <string.h>

    int main(void)
    {
        int res = 1;                                /*Creates an integer to hold the result of the check for the file*/
        const char *file = "input.txt";             /*String holding the name of the file with the input data*/

        res = access(file,R_OK);                    /*Checks if the file "input.txt" exists*/

        if(res == -1)
        {                                           /*IF the file doesn't exist:*/
            FILE *input = fopen("input.txt","w");   /*This creates a file called "input.txt" in the directory of the program*/
            char write[] = "1\n1\n+";               /*This variable holds the string that's to be written to the file*/
            fprintf(input,"%s",write);              /*This writes the variable "write" to the file*/
            printf("input.txt file created!");      /*Tells you the file is created*/
            fclose(input);                          /*Closes the file after it's done*/
        }
        else
        {                                           /*IF the file exists:*/
            FILE *f = fopen("input.txt","r");

            //char line[ 5000 ];
            //while ( fgets ( line, sizeof line, f ) != NULL )
            //{
            //    fputs ( line, stdout );
            //}

            char line[5000];
            char nums[2];
            char symbol[1];

            int i = 0;
            while(fgets(line,sizeof line,f)!=NULL)
            {
                i++;
                if(i < 3)
                {
                    fputs(nums,f);
                }
                else
                {
                    fputs(symbol,f);
                }

                printf("%d,%d",nums,symbol);
            }

            printf("\n\n\n");
            scanf("\n");
        }

        return 0;
}

任何帮助将不胜感激!提前谢谢您如果您需要更多信息,我会提供。

4

3 回答 3

2

这是一个不言自明的算法。此外,这是执行您要查找的操作的代码。通常,复杂的操作是使用堆栈、推送和弹出方法完成的。一旦运营商被推动。需要应用 BODMAS 规则来评估表达式。由于给你的问题很简单,一个简单的表达式求值。这可以通过FIFO简单地实现。这是算法,一般解释。之后,代码就出现了。此代码经过良好测试。您可以将其扩展为执行 +、-、除 /、% 等操作。如果您喜欢我的回答,请欣赏。

在此处输入图像描述

#include "stdio.h"

int main(int argc, char *argv[])
{

  FILE *fp_op;

  int buff[2]; /** assuming a simple operation, thus the buffer size is 3 only, the last one is to store the NULL **/

  char operat_buff[2]; /** assuming this operation we can extend it to evaluate an expression **/

  fp_op = fopen("calc.txt","rb");

  if ( fp_op == 0 )
  {
     perror("The file doesn't exist to calculate\r\n");

     goto error; 

  }


 /** Read the two numbers here **/
 fscanf(fp_op,"%d",&(buff[0]));

 printf("The buff[1] = %d\r\n",buff[0]);

 fscanf(fp_op,"%d",&(buff[1]));

 printf("The buff[1] = %d\r\n",buff[1]);


  /** read the next line now \n **/

  operat_buff[0] = fgetc(fp_op);

  /** read the actual character now **/

   operat_buff[0] = fgetc(fp_op);

  printf("The operat_buff[0] = %d\r\n",operat_buff[0]);

 /** Read operation completed **/

 /** use switch here **/


  switch(operat_buff[0])
  {
    case '*':

      printf("The multiplication result=%d\r\n",buff[0]*buff[1]);
      break;

    case '+':
       printf("The Addition result=%d\r\n",buff[0]+buff[1]);
      break;

    default:

      printf("Add more operations\r\n");

  }

  return 0;

 error:
       return -1;


}

I assume that the calc.txt was something like this.

calc.txt

3
5
*

注意:此代码经过编译和验证。它编译时出现零警告。它也进行错误检查。可以直接复制粘贴。

于 2013-09-25T08:56:27.347 回答
1
printf("%d,%d",nums,symbol);

在您的代码中nums,并且symbol是字符串,您不能使用%d. 你得到的是numssymbol数组的地址,即使那不是打印地址的正确方法。

您可能希望使用strtolor将它们转换为整数,sscanf然后使用它们来执行计算。

于 2013-09-24T19:47:55.217 回答
1

您从文件中读取的内容只是字符代码:程序无法自行确定字符“4”对应于整数 4。 printf 的 %d 占位符需要 int 变量,否则它将不起作用.

如果您只想打印字符,则必须将它们保存在 char 变量(或 char 数组)中,并在 printf 中使用占位符 %c。如果您想在程序中实际使用数字和符号,您还有更多工作要做。

不仅在 C 中,而且我认为在大多数语言中,您必须将字符“解析”为数字。

在 C 中,您可以使用 atoi 或 atol 函数(您必须#include <stdlib.h>)来进行此转换。

为了解析符号,恐怕您必须使用 if 或 switch 来读取字符并相应地执行操作。

例如,您的循环可能如下所示:

  while(fgets(line,sizeof line,f)!=NULL)
    {
      int op1;
      int op2;
      int res;
      char symbol;
      i++;
      switch (i) {
        case 1:
          //First line is first operand
          op1 = atoi(line);
          printf("op1 %d\n",op1);
          break;
        case 3:
          //Second line is second operand
          op2 = atoi(line);
          printf("op2 %d\n",op2);
          break;
          //Fifth line is the operator, could be +,-,%./ or anything
        case 5:
          symbol = line[0];
          printf("operand %c\n",symbol);
          switch(symbol) {
            case '+':
              res = op1+op2;
              break;
            case '-':
              res = op1-op2;
              break;
            default:
              //operation not defined, return
              return;

          }
          printf("%d%c%d = %d",op1,symbol,op2,res);
      }
    }
于 2013-09-24T20:16:49.193 回答