我在名为的文本文件中有以下内容:values.txt
1 4
2.5 3.76
122 10
277.543
165.4432
我正在尝试阅读此文本文件的内容,并将每两对添加到一起并输出结果... 输出将是这样的:
1 Pair:(1, 4) = 5
2 Pair:(2.5, 3.76)= 6.26
依旧......
我正在打开这样的文件
int c;
FILE myfile;
myfile= fopen("values.txt", "r");
if ( myfile == NULL ) {
printf("Cannot open TEXT file\n");
return 1;
}
double aa,bb;
while ( (c = getc(myfile) ) != EOF ) {
// HERE SHOULD I DO THE OUTPUT BUT HOW?
}
真的很感激任何帮助..
语言= C
答案 0 :(得分:2)
以下代码可以满足您的期望。 myfile应声明为FILE *。 fopen返回指向FILE结构的指针。如果文件非常大,我建议读取大尺寸的缓冲区(例如:65535等)并通过char解析它并将其转换为浮点值。它减少了系统调用开销,这比处理文本浮动值需要更多的时间。
#include <stdio.h>
#include <string.h>
main(int argc, char *argv[])
{
FILE* myfile;
myfile = fopen("values.txt", "r");
if ( myfile == NULL ) {
printf("Cannot open TEXT file\n");
return 1;
}
double aa,bb;
while (2 == fscanf(myfile, "%lf %lf", &aa, &bb)) {
printf("%lf\n", aa+bb);
}
return 0;
}
答案 1 :(得分:0)
对于这个简单的任务,请使用
double a, b; if (fscanf(myfile, "%lf %lf", &a, &b) == 2) printf("%f + %f = %f\n", a, b, a+b);。
答案 2 :(得分:0)
看起来像是一个家庭作业问题,但fscanf
可以将字符串读入变量,如:
int n;
fscanf (myfile,"%d",&n);
答案 3 :(得分:0)
您没有向单值行显示所需的输出,但这看起来像fgets()
和sscanf()
的情况,除非您真的希望这两行具有单个值作为一个单元进行处理。
char buffer[256];
int rownum = 0;
while (fgets(buffer, sizeof(buffer), myfile) != 0)
{
double aa, bb;
int n = sscanf(buffer, "%lf %lf", &aa, &bb);
if (n == 2)
printf("%d Pair:(%g, %g) = %g\n", ++rownum, aa, bb, aa+bb);
else if (n == 1)
printf("%d Solo:(%g) = %g\n", ++rownum, aa, aa);
else
{
printf("Failed to find any numbers in <<%s>>\n", buffer);
}
}
如果您使用fscanf(myfile, "%g %g", &aa, &bb)
,那么它会读取换行符(它们计为空格)以查找数字,因此它会从一行读取一个数字,而从另一行读取第二个数字。这通常不是人们所追求的(但是当你需要它时,它非常有用)。使用fscanf()
进行错误恢复往往比使用fgets()
和sscanf()
更加充实。
答案 4 :(得分:0)
它在c ++抱歉:(我不知道c
这是一个非常简单的简单明德的逻辑代码:我也是一个初学者,我还没有测试过这个编程,如果出现问题但是确切地说对不起 在同样的原则上工作我的解析器,它工作正常。所以这是一个真正的方法。不是很有效但是...... 不要马上使用这个程序,了解它的逻辑,这将帮助你很多。复制不会给你任何东西 ...解析器导师是如此罕见....
int x = 0; char ch ='r'; //我用这个方法来避免ch的第一次ckeck出错。 程序启动时必须用东西填充。 char bigch [10]; int checknumber = 0;
float firstnumber = 0; float secondnumber = 0; float result = 0;
void clearar(char frombigar [10],int xar)//这个函数获取bigch作为引用,这意味着eny 这里所做的改变,将直接影响到bigch本身。 函数获取数组的实际长度并放置空格 在bigch的每个元素中都将数字归零。我们需要明确 任何以前的数字都很重要。低于你,看看为什么我需要这个。 'xar'是来自main函数的x。它在这里告诉我们清洁工 填充bigar元素的真实长度。 { for(int i = 0; i }
}
int main() { &lt; ------------------- //在这里添加文件打开和读取命令 while(!myfile.eof())//但尚未到达txt文件的结尾 { CH = myfile.get(); //将每个字母输入ch,并将光标移动一步 在txt文件中转发以供进一步阅读。 get()自动执行游标转发
if (ch!= " ") //i used space as an indicator where one number ends
//so while space havent been reahced, read letters.
{ bigch[x] = ch; //get read letter into bigch array.
x++; //icrement bigch array step
}
else
if(ch == " ") //if space is reached that means one number has ended and
{ im trying to set a flag at that moment. it will be used further.
checknumber++; the flag is simple number. first space will set checknumber to 1
second space will set it to 2. thats all.
}
if (checknumber == 1) //if our checknumber is 1, wich means that reading
of first number is done, lets make one whole float
from that bigch array.
{firstnumber = atof(bigch); //这里我们得到bigch,atof(array to float)命令转换 bigch数组成一个整数浮点数。
clearar(bigch,x); //here we send bigch and its element step into function where
bigch gets cleaned because we dont want some ghost numbers in it.
abviously clearar function cleans bigch int main function aswell,
not only in it's teritory. its a global cleaning :)
}
else if (checknumber ==2) //here we do the same but if flag is 2 this means that two spaces
had been passed and its time to convert bigch into secondnumber.
{ secondnumber = atof(bigch); //same method of converting array into float (it hates other
not number letters, i mean if its a number its fine. if in your text
was 'a' or 's' in that case atof will panic hehe.. )
clearar(bigch,x); //same thing, we send bigch to cleaner function to kill any numbers
it, we get one space letter ( " " ) into each element of bigch.
}
checknumber = 0;如果两个数字都已被读出并转换。我们需要重置 太空旗手。并从0开始计算;对于下一对数字。
result = firstnumber + secondnumber;一切都很清楚。 } }