2013-09-24 5 views
0

Я полностью новичок в C, и я работаю над программой, которая должна читать в трех строках из текстового файла (два числа и математический символ) и выписывать результат , Так, например:Чтение строк из файла в массивы символов

Текстовый файл выглядит следующим образом:

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

Любая помощь будет принята с благодарностью! Заранее благодарю вас Если вам нужна дополнительная информация, я предоставил ее.

ответ

1

Что вы читаете из файлов, это просто коды символов: программа не имеет возможности сама по себе определить, что символ «4» соответствует целочисленному номеру 4. Заместитель% d printf ожидает переменные int или не будет работать.

Если вы хотите просто напечатать символы, вы должны сохранить их в переменных char (или массиве символов) и использовать placeholder% c в printf. Если вы действительно хотите использовать цифры и символы в своей программе, вам нужно сделать больше работы.

Не только в 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); 
     } 
    } 
+0

Спасибо! Это отлично работает! – WolfyD

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

В коде nums и symbol являются строками, вы не можете распечатать их с %d. То, что вы получаете, это адреса массивов nums и symbol соответственно, даже если это неправильный способ печати адреса.

Скорее всего, вы захотите преобразовать их в целые числа, используя strtol или sscanf, а затем использовать их для выполнения вычислений.

2

Это само за себя алгоритм. Кроме того, вот код, который выполняет операцию, которую вы ищете. Как правило, сложные операции выполняются с использованием метода stack, push и pop. Как только операторы будут нажаты. Чтобы оценить выражение, нужно применить правило BODMAS. Поскольку заданная вам задача проста, простая оценка выражения. Это может быть просто достигнуто FIFO. Вот алгоритм, общее объяснение. Впоследствии код присутствует. Этот код хорошо протестирован.Вы можете расширить его, чтобы выполнять операции, такие как +, -, деление /,% и т. Д. Если вам нравится мой ответ, пожалуйста, оцените.

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 
* 

Примечание: Этот код компилируется и verified.It компилирует с нулевым предупреждением. Он также выполняет проверку ошибок. Вы можете напрямую скопировать и вставить его.

Смежные вопросы