我在将txt文件中的值读入程序时遇到问题。我给出的值为坐标(x,y),后跟2个空格。它给出了最大点数为100,那么如何读取输入以便我的程序只能读取每行给定数量的值?到目前为止,我的程序旨在计算两点之间的距离,并使用总和来找到周长。
3 12867 1.0 2.0 1.0 5.0 4.0 5.0
5 15643 1.0 2.0 4.0 5.0 7.8 3.5 5.0 0.4 1.0 0.4
到目前为止,我能想到的只有:
scanf("%f %f %f %f %f %f", &x1, &y1, &x2, &y2, &x3, &y3);
到目前为止,这是我的计划。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_PTS 100
#define MAX_POLYS 100
#define END_INPUT 0
struct Point {
double x, y;
};
double getDistance(struct Point a, struct Point b) {
double distance;
distance = sqrt((a.x - b.x) * (a.x - b.x) + (a.y-b.y) *(a.y-b.y));
return distance;
}
int main(int argc, char *argv[]) {
int npoints, poly_id;
struct Point a, b;
if(scanf("%d %d", &npoints, &poly_id)) {
scanf("%lf %lf", &a.x, &a.y);
scanf("%lf %lf", &b.x, &b.y);
} else { printf("\nUnable to read input.\n");
exit(EXIT_FAILURE);
}
printf("\nStage 1\n=======\n");
printf("First polygon is %d\n", poly_id);
printf(" x_val y_val\n %1.1f %1.1f\n %1.1f %1.1f\n",
a.x, a.y, b.x, b.y);
printf("perimeter = %2.2lf m\n", getDistance(a, b));
return 0;
}
输出为:
First polygon is 12867
x_val y_val
1.0 2.0
1.0 5.0
perimeter = 3.00 m
编辑:我必须补充一点,必须使用重定向读取txt文件, 例如./program&lt; txt文件
答案 0 :(得分:1)
scanf
and family返回一个值,告诉您它设法扫描了多少个值:
返回值
These functions return the number of input items successfully matched and assigned, which can be fewer than provided for, or even zero in the event of an early matching failure.
因此,您仍然可以使用scanf
,前提是您知道最大点数。这是sample program:
#include <stdio.h>
void read(char *line) {
float x1 = 0, x2 = 0;
int n = sscanf(line, "%f %f", &x1, &x2);
printf("Read %d, %f %f\n", n, x1, x2);
}
int main(void) {
char *line1 = "1.0";
char *line2 = "1.0 2.0";
read(line1);
read(line2);
return 0;
}
输出:
Read 1, 1.000000 0.000000
Read 2, 1.000000 2.000000
然而,从事物的声音来看,100是很多数字,因此您可以尝试使用strtok
进行标记并在循环中读取值。
答案 1 :(得分:0)
关于您的方法
要从文件中读取数据,您需要fscanf()
功能。在这里阅读man page。
注意:如果您想使用fscanf()
,强烈建议您检查相同的返回值以确保输入正确。
关于值的存储,您可以使用以下任一方法
malloc()/calloc()/realloc()
。 (更灵活)替代方法:
更好的方法是
答案 2 :(得分:0)
从我在你的点示例中看到的,你有一个特定的分离标签和新线。我的建议如下:
一旦检测到数字字符,激活一个新状态(一种方法),开始检测一个点UNTIL一个标签(“\ t”)或一个新行(“\ n”)被检测到。由于您有固定的格式化,您可以使用
scanf("%f %f", &x1, &x2);
当你检测到一个数字字符时(我建议你使用一个数组(因为你有一个固定数量的点)点(一个点是一个结构,x,y作为它的成员)。你必须向后返回一个字符为了检测点的完整坐标,因为点的第一个数字字符用于触发检测状态。
一旦检测到标签或新行返回循环并继续“吃掉”标签和新行,直到下一个数字字符。
在您的示例中,解析可能如下所示:
希望这会有所帮助。 :)
答案 3 :(得分:0)
请尝试以下代码段:
#include <stdio.h>
#include <stdlib.h>
int main()
{
char ch, file_name[25];
FILE *fp;
int count=0;
int i,j;
int cordinate[5][5];
fp = fopen('a.txt',"r"); // read mode
if( fp == NULL )
{
perror("Error while opening the file.\n");
exit(EXIT_FAILURE);
}
while( ( ch = fgetc(fp) ) != EOF ){
printf("%c",ch);
for(i=0;i<5;i++)
{
for(j=0;j<5;j++){
if(ch==' '){
count++;
cordinate[0][0]=
}
else{
cordinate[i][j]=ch;
}
}
}
}
printf('print content of file');
for(i=0;i<5;i++)
{
for(j=0;j<5;j++){
printf("cordinates:%d"+cordinate[i][j]);
}
}
}
fclose(fp);
return 0;
}
答案 4 :(得分:0)
在编程中,当他们想要一次又一次地work
时,会使用循环。
认为要计算多边形的公尺,需要计算其边长。如果给定两个相邻点,则函数getDistance
可以找到边的长度。因此,您不断寻找边缘的长度并添加它们。现在想想重复的是什么work
。它是getDistance
新点。因此,请查看以下代码中的for
循环。
我在代码中写了一些注释来说明这一点。
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX_PTS 100
#define MAX_POLYS 100
#define END_INPUT 0
struct Point {
double x, y;
};
double getDistance(struct Point a, struct Point b) {
double distance;
distance = sqrt((a.x - b.x) * (a.x - b.x) + (a.y-b.y) *(a.y-b.y));
return distance;
}
int main(int argc, char *argv[]) {
int npoints, poly_id;
struct Point a, b;
if(scanf("%d %d", &npoints, &poly_id)) {
int iteration = 0;
scanf("%lf %lf", &a.x, &a.y);
struct Point initialPoint = a;
double parimeter = 0; // i start with 0 value of parimeter.
for (iteration = 1; iteration < npoints; ++iteration) {
scanf("%lf %lf", &b.x, &b.y); // take input for new-point.
parimeter += getDistance(a, b); // add the parimeter.
// for next iteration, new-point would be first-point in getDistance
a = b;
}
// now complete the polygon with last-edge joining the last-point
// with initial-point.
parimeter += getDistance(a, initialPoint);
// print the information.
printf("Polygon is %d\n", poly_id);
printf("perimeter = %2.2lf m\n", parimeter);
} else { printf("\nUnable to read input.\n");
exit(EXIT_FAILURE);
}
return 0;
}
请参阅操作中的代码:Working Code。
请注意我已经给出了
输入:
3 12867 1.0 2.0 1.0 5.0 4.0 5.0
,输出为:
Polygon is 12867
perimeter = 10.24 m
现在,如果你想为更多的多边形做work
,希望你知道该做什么!!!