无法从文件

时间:2016-10-12 00:36:51

标签: c

我的数据如下:

  4.2    6.0

  3.1    4.0

 10.5   10.0

 23.0    8.0

 9.7     4.0

 15.9    5.0

我试图一次读入两个值,将它们分配给我的变量,然后打印出结果。我无法弄清楚为什么没有读取值。我的模板打印到我的输出txt文件,但是我的下面没有任何值打印出来。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define INPUT_FILE "lab3.dat"
#define ANSWER_FILE "lab3.txt"

int main(void)
{
int nsides;
double radius;
double perimeter;
double area;

FILE* my_data;
FILE* out_file;

my_data = fopen(INPUT_FILE, "r");
if(my_data == NULL)
{
    printf("Error on opening the data file\n");
    exit(0);
}

out_file = fopen(ANSWER_FILE,"w");
if(out_file == NULL)
{   
    printf("Error on opening the output file\n");
    exit(0);
}

perimeter = 2*nsides*radius*sin(M_PI/nsides);
area = 0.5*nsides*(radius*radius)*sin((2*M_PI)/nsides);

fprintf(out_file, "\nNima Sarrafzadeh. Lab 3.\n\n");
fprintf(out_file, "         Number Perimeter Area Of \n");
fprintf(out_file, " Radius Of Sides Of Polygon Polygon \n");
fprintf(out_file, "-------- -------- ------------ ----------- \n");
while((fscanf(my_data, "%d%d", &radius, &nsides))==2){
    fprintf(out_file, "%d %d %d %d",radius, nsides, perimeter, area, "\n");
}

fclose(my_data);
fclose(out_file);
}       

1 个答案:

答案 0 :(得分:2)

如果出现直接问题,您是否尝试混合文件中的integerdouble读取内容。由于文件包含带有小数点的值,因此您需要同时读取double(或float),然后将实数取为整数{{1} }。

您的编译器也应该尖叫警告您使用nsidesfscanf(特别是给出了无效的指针类型和格式的参数太多)。如果您没有看到一些警告,请确保始终使用 警告启用 进行编译(例如使用fprintf,并且对于几乎所有可能的警告,请添加-Wall -Wextra)不要接受编译任何警告的代码。

如果您重新考虑格式字符串,并在其所属的格式字符串中包含-pedantic,您可以执行以下操作:(注意它将输入/输出的文件名作为第一个和分别为第二个参数(如果没有给出参数,则默认为读取/写入'\n'

stdin/stdout

特别注意有关#include <stdio.h> #include <stdlib.h> #include <math.h> int main (int argc, char **argv) { int nsides = 0; double radius, perimeter, area, ntmp; FILE *fp = argc > 1 ? fopen (argv[1], "r") : stdin, *ofp = argc > 2 ? fopen (argv[1], "w+") : stdout; if (!fp || !ofp) { /* validate files open for reading/writing */ fprintf (stderr, "error: file open failed\n"); return 1; } /* write heading to output file */ fprintf (ofp, "\nNima Sarrafzadeh. Lab 3.\n\n" " Number Perimeter Area Of \n" " Radius Of Sides Of Polygon Polygon \n" "-------- -------- ------------ ----------- \n"); /* validate 2 values read for each iteration */ while (fscanf (fp, " %lf %lf", &radius, &ntmp) == 2) { nsides = (int)ntmp; perimeter = 2*nsides*radius*sin(M_PI/nsides); area = 0.5*nsides*(radius*radius)*sin((2*M_PI)/nsides); fprintf (ofp, "%7.2lf %7d %10.2lf %10.2lf\n", radius, nsides, perimeter, area); } if (fp != stdin) fclose (fp); /* close file if not stdin */ if (ofp != stdout) fclose (fp); /* close file if not stdout */ return 0; } 验证 评论。

示例使用/输出

fscanf

仔细看看,如果您有其他问题,请告诉我。