从文件中读取行到字符数组

时间:2013-09-24 19:45:46

标签: c arrays fgets fputs

我是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;
}

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

3 个答案:

答案 0 :(得分:2)

这是一个不言自明的算法。此外,这是执行您正在寻找的操作的代码。通常,使用stack,push和pop方法完成复杂操作。一旦操作员被推动。需要应用BODMAS规则来评估表达式。由于给你的问题很简单,一个简单的表达式评估。这可以通过FIFO简单地实现。这是算法,一般解释。之后,代码存在。此代码经过了充分测试。您可以将其扩展为执行+, - ,division /,%等操作。如果您喜欢我的答案,请欣赏。

enter image description here

#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
*

注意:此代码已编译和验证。它编译为零警告。它也会进行错误检查。您可以直接复制并粘贴它。

答案 1 :(得分:1)

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

在您的代码中numssymbol是字符串,您无法使用%d打印它们。你得到的是numssymbol数组的地址 - 即使这不是打印地址的正确方法。

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

答案 2 :(得分:1)

你从文件中读到的只是字符代码:程序无法自己确定字符“4”对应于整数4。printf的%d占位符需要int变量,否则它赢了不行。

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

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

在C中你可以使用atoi或atol函数(你必须#include <stdlib.h>)才能进行这种转换。

为了解析符号,我担心你必须使用if或a开关来读取字符并相应地执行操作。

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

  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);
      }
    }