【问题标题】:(C) Reading from a Text File to a Structure(C) 从文本文件读取到结构
【发布时间】:2013-12-25 00:25:28
【问题描述】:

我正在尝试将多个不同的数据类型(char、int、float)从文本文件直接读取到结构中。

readData() {
char filename[100];
int linesread;
int i = 0;

printf("Enter the assets text file that you wish to read: \n");
scanf("%s", filename);

if ((fp = fopen(filename, "r")) == NULL) {
    printf("Error opening data file\n");
    readData();
} else {
    while (fscanf(fp, "%s %c %s %lf %lf %d %d %d", &assets[i].name, &assets[i].type, &assets[i].location, &assets[i].longi, &assets[i].lati, &assets[i].speed, &assets[i].fuelTime, &assets[i].readyTime != EOF)) {
        i++;
    }
}
fclose(fp);
linesread = i;

for (i = 0; i < linesread; i++) {
    printf("%s %s %s %lf %lf %d %d %d\n", &assets[i].name, &assets[i].type, &assets[i].location, &assets[i].longi, &assets[i].lati, &assets[i].speed, &assets[i].fuelTime, &assets[i].readyTime);
}

这应该读出来(当它决定合作时)并将其保存到结构中:

 Angle_Lifeboat L Angle 51.685 -5.102 25.0 600 120
 Angle_ILB L Angle 51.685 -5.102 25.0 180 30
 Broad_Haven_ILB L Broad_Haven 51.713 -5.113 25.0 180 30

但改为阅读此内容

ngle_Lifeboat LAngle Angle 0.000000 0.000000 0.000000 4231936 4231940
Angle_ILB LAngle Angle 0.000000 0.000000 0.000000 4232008 4232012
Broad_Haven_ILB LBroad_Haven Broad_Haven 0.000000 0.000000 0.000000 4232080 4232084

我对 C 很陌生,所以请放轻松。非常感谢您提供的任何帮助

编辑:结构 -->

 typedef struct assets{
char name[25];
char type[1];
float longi;
float lati;
char location[20];
int speed;
int fuelTime;
int readyTime;
 } assets;

【问题讨论】:

  • 请出示您的struct的声明。
  • != EOF 位置不好。
  • 编辑EOF的位置

标签: c struct scanf


【解决方案1】:

在 c 编程中,我确实认为已经有一个 in build 函数来执行上述操作... 尝试使用 fread http://www.tutorialspoint.com/c_standard_library/c_function_fread.htm

【讨论】:

  • 建议/思考不是此类问题的答案
  • 任何帮助都非常棒。 'fread' 看起来很有用,有人能给我一些关于如何正确使用它的建议
【解决方案2】:
fread(&my_struct, sizeof(my_struct), 1, fp);

【讨论】:

    【解决方案3】:
    • BLUEPIXY 正确地注意到了 != EOF 错误位置;正确的是:

      … &assets[i].readyTime) != EOF) {
      
    • 我们不能将assets[i].type 中的字符打印为带有%s 的字符串,因为1-char-array type[1] 没有(容纳)终止空字符;我们必须将其打印为 precision .1 或字符的字符串:

      printf("…%.1s…\n", …assets[i].type…);   // need no & operator
      

      printf("…%c…\n", …*assets[i].type…);    // need * operator
      
    • 转换规范%lf 用于指向double(而不是float)的指针; floats 需要转换规范%f

    • 由于speed 的值是25.0,我们不能用%d 将它们读取为整数;我们宁愿需要用%f 读取float 变量,或者是一个临时变量然后分配给assets[i].speed,或者通过在assets 中定义float speed;

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-17
      • 1970-01-01
      • 2021-11-10
      • 2017-04-13
      • 1970-01-01
      相关资源
      最近更新 更多