#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;
我已经在线阅读了一两个小时,但我仍然没有想到这个问题。任何帮助将不胜感激!
答案 0 :(得分:4)
您需要致电fscanf
而不是scanf
。养成阅读scanf(3)上正在使用的函数文档的习惯。如果您有可能在Linux上编码,请键入
man scanf
并使用
进行编译gcc -Wall -Wextra -Wpedantic -g yourfile.cc -o yourprog
然后了解如何使用GDB debugger(gdb
)并运行
gdb yourprog
BTW,以scanf
格式提供精确度是没用的。使用scanf
或fscanf
的结果是很好的做法
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>
代表strerror
和errno
,请阅读strerror(3)和errno(3)
我还建议使用printf
结束\n
格式字符串(因为stdout
已缓存,请参阅stdout(3)!)或在适当的位置使用fflush(3)
答案 1 :(得分:1)
scanf
和fscanf
不同。 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);