我是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;
}
任何帮助将不胜感激! 先感谢您 如果您需要更多信息,我会提供。
答案 0 :(得分:2)
这是一个不言自明的算法。此外,这是执行您正在寻找的操作的代码。通常,使用stack,push和pop方法完成复杂操作。一旦操作员被推动。需要应用BODMAS规则来评估表达式。由于给你的问题很简单,一个简单的表达式评估。这可以通过FIFO简单地实现。这是算法,一般解释。之后,代码存在。此代码经过了充分测试。您可以将其扩展为执行+, - ,division /,%等操作。如果您喜欢我的答案,请欣赏。
#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);
在您的代码中nums
和symbol
是字符串,您无法使用%d
打印它们。你得到的是nums
和symbol
数组的地址 - 即使这不是打印地址的正确方法。
您可能希望使用strtol
或sscanf
将它们转换为整数,然后使用它们执行计算。
答案 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);
}
}