从C中的文件中读取移动数据(字符串和数字)

时间:2016-10-12 09:54:50

标签: c file

我有一个包含以下格式数据的文件:

/*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;
}

但这不能给出必要的结果吗?任何人都可以提出更好的方法或查看我的代码有什么问题吗?

2 个答案:

答案 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?

我相信它会回答你的问题..