我有一个包含以下格式数据的文件:
/*Number Date Time Status Call_duration(in minutes) */
9893575103 22-09-2016 12:32:01 incoming 2
9893575102 22-09-2016 12:44:05 outgoing 3
9893575101 22-09-2016 12:59:23 missed 0
9793575103 22-09-2016 13:30:32 outgoing 9
9723575103 22-09-2016 14:44:44 incoming 4
我希望能够可靠地将这些数据读入C程序,然后在解析数据后对其进行操作。
我尝试使用scanf:
从文件中读取数据后将数据存储在链表中struct Node {
struct node *queue;
struct node *front,*rear;
int num[10];
int dd,mm,yy,hr,min,sec;
float call_dur;
char status[15];
};
main()
{
node *rear=NULL;
node *front=NULL;
node *queue;
char ch;
FILE *fp;
fp=fopen("mobile_numbers.txt","r");
while((ch=getc(fp))!=EOF) {
fseek(fp,-1,1);
fscanf(fp,"%d %d-%d-%d %d:%d:%d %s %d", &queue->num, &queue->dd, &queue->mm, &queue->yy, &queue->hr, &queue->min, &queue->sec, queue->status, &queue->call_dur);
}
if(front==NULL)
front=queue;
else
rear->next=queue;
rear=queue;
queue->next=NULL;
}
fclose(fp);
while(queue!=NULL) {
printf("%d %d-%d-%d %d:%d:%d %s %d",queue->num, queue->dd, queue->mm, queue->yy, queue->hr, queue->min, queue->sec, queue->status, queue->call_dur);
queue=queue->next;
}
但这不能给出必要的结果吗?任何人都可以提出更好的方法或查看我的代码有什么问题吗?
答案 0 :(得分:0)
这很有效。不知道你想对数据做什么,但这会打印到屏幕上。
#include <stdio.h>
#include <string.h>
#define MAXLINE 1000
#define MAXARG 20
FILE *f1;
int main(int argc, char *argv[])
{
char FileName[MAXARG];
char line[MAXLINE];
if (argc <= 1) {
printf("Usage - reads FileName and prints\n");
return 0;
}
else {
strcpy(FileName, *++argv);
}
f1 = fopen(FileName, "r");
while (fgets(line, MAXLINE, f1)) {
printf("%s", line);
}
}
注意:要调用它,您必须输入程序名称,后跟文件名。
如果您希望运行并保存数据以进行解析,请尝试此操作(C read space-separated values from file的重新适当版本):
#define _XOPEN_SOURCE
#include <stdio.h>
#include <time.h>
#include <string.h>
typedef struct
{
char status[9];
time_t timestamp;
long int number;
int duration_mins;
time_t call_time;
} Call;
void dump_call(FILE *fp, const char *tag, const Call *c);
int inputLine(FILE *fp, Call *c);
enum { MAXCALL = 100 };
int main(void)
{
char line[4096];
Call calls[MAXCALL];
if (fgets(line, sizeof(line), stdin) == 0)
return 1;
for (int i = 0; i < MAXCALL && inputLine(stdin, &calls[i]) != 0; i++)
dump_call(stdout, "Call", &calls[i]);
return 0;
}
int inputLine(FILE *fp, Call *c)
{
struct tm tm;
// time_t epoch;
int out;
char temp[20], date_temp[9], time_temp[9];;
if ((out = fscanf(fp, "%ld %s %s %s %d",
&c->number, date_temp, time_temp, c->status, &c->duration_mins)) == 5) {
sprintf(temp, "%s %s", date_temp, time_temp);
if ( strptime(temp, "%d-%m-%Y %H:%M:%S", &tm) != NULL )
c->timestamp = mktime(&tm);
return -1;
}
return 0;
}
void dump_call(FILE *fp, const char *tag, const Call *c)
{
char date_time[20];
strftime(date_time, 20, "%d-%m-%Y %H:%M:%S", localtime(&(c->timestamp)));
fprintf(fp, "%s: %-10ld %-24s %-17s %3d\n",
tag, c->number, date_time, c->status, c->duration_mins);
}
这一次,要调用它,键入程序名称后跟<
,然后输入数据文件名称;即:
read.exe < test_mobil.dat
希望这有助于交配 - 我也学到了很多 - 所以非常感谢。
答案 1 :(得分:0)
检查这个答案 - How to read specifically formatted data from a file?
我相信它会回答你的问题..