使用C从文件读入结构

时间:2014-04-05 21:48:05

标签: c

#include <stdio.h>
#include <stdlib.h>

FILE * fptr;
struct invStruct
{
int frame;
float elec;
float vdw;
float total;
};

int main()
{
int i;
fptr = fopen("/Users/jmindrebo/C_programming/structuretest.txt", "r");
if(fptr == 0){
printf("file not found\n");
exit(1);
}

struct invStruct item[4000] = {0};
for (i=0; i<1; i++)
{
    scanf(fptr, "%d\t%.4f\t%.4f\t%4.f", &item[i].frame, item[i].elec, item[i].vdw, item[i].total);
    printf("%s\t%.4f\t%.4f\t%4.f", item[i].frame, item[i].elec, item[i].vdw, item[i].total);  
}
fclose(fptr);
return 0;
}

我对编码比较陌生,上周刚开始学习C语,所以这是迄今为止我能想到的最好的。我试图将此制表符分隔的文本文件读入结构,以便我可以在某些计算中使用这些值。我无法将我的文本文件的值加载到2D数组中,因此我认为这样做会更容易,同时仍能正常工作。

我一直得到的错误是: /usr/include/stdio.h:274:6:注意:期待&#39; const char *&#39;但是参数的类型为&#39; struct FILE *&#39;

我已经在线阅读了一两个小时,但我仍然没有想到这个问题。任何帮助将不胜感激!

3 个答案:

答案 0 :(得分:4)

您需要致电fscanf而不是scanf。养成阅读scanf(3)上正在使用的函数文档的习惯。如果您有可能在Linux上编码,请键入

man scanf

并使用

进行编译
gcc -Wall -Wextra -Wpedantic -g yourfile.cc -o yourprog

然后了解如何使用GDB debuggergdb)并运行

gdb yourprog
BTW,以scanf格式提供精确度是没用的。使用scanffscanf的结果是很好的做法

   int nbread = fscanf(fptr, "%d %f %f %f", 
      &item[i].frame, &item[i].elec, &item[i].vdw, &item[i].total);
   if (nbread != 4) {
      fprintf(stderr, "failed to read entry #%d (%s)\n", 
              i, strerror(errno));
      exit(EXIT_FAILURE);
   }

顺便说一句,您可以删除scanf格式的大多数空格。我经常把它们留给 使格式字符串更具可读性。 你需要

   #include <string.h>
   #include <errno.h>

代表strerrorerrno,请阅读strerror(3)errno(3)

我还建议使用printf结束\n格式字符串(因为stdout已缓存,请参阅stdout(3)!)或在适当的位置使用fflush(3)

答案 1 :(得分:1)

scanffscanf不同。 scanf的第一个参数是格式字符串;它默认输出到stdout。你想要的是fscanf,它将输出指针作为第一个参数,格式字符串作为第二个参数。请参阅this

答案 2 :(得分:1)

使用fscanf代替scanf,正如其他人已经说过的那样。还要在扫描功能的参数前添加&符号 您也可以从扫描格式中删除TAB字符(&#34; \ t&#34;)。

fscanf(fptr, "%d%.4f%.4f%4.f", &item[i].frame, &item[i].elec, &item[i].vdw, &item[i].total);