2016-10-12 3 views
-1

У меня есть файл с данными в следующем формате:Чтение мобильных данных (строки и числа) из файла в C

/*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, а затем манипулировать данные после того, как они были проанализированы.

Я пытался хранить данные в виде связанного списка после прочтения его из файла с помощью зсапЕ:

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

ayushi было бы то же самое, как если бы вы прочитать любой файл в с https://www.google.co .в/поиск? NewWindow = 1 & espv = 2 & д = чтение + и + печать + от + файл + в + с & OQ = чтение + и + печать + от + файл + в + с & gs_l = serp.12 ... 0.0.0.83982.0.0 .0.0.0.0.0.0..0.0 .... 0 ... 1c..64.serp..0.0.0.iWgCkAWSlLw – JerryGoyal

+0

Я пробовал этот fscanf (fp, "% d \ t% d- & d-% d \ т% d:% d:% d \ т% s \ т% 1f», & queue-> Num, & queue-> дд, & queue-> мм, & queue-> уу, & queue-> ч, и queue-> мин, & queue-> сек, queue-> статус, и queue-> call_dur); для хранения данных в связанном списке. Но он не работает. – Ayushi

ответ

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); 
    } 
} 

NB: для его вызова вам необходимо ввести имя программы, а затем имя вашего файла.

Если вместо этого вы хотите, чтобы пробежать и сохранять данные для синтаксического анализа, попробуйте это (повторно присвоила версию 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 

Надеется, что это помогает помощнику - я узнал совсем немного, а - так что спасибо за это.

+0

Спасибо, это сработало. Но что делать, если мне нужно хранить данные в связанном списке и сравнивать статус (пропущенный, исходящий, входящий), чтобы сформировать другой связанный список, соответствующий статусу. Вот почему я попытался сохранить его в связанном списке, используя fscanf. – Ayushi

+0

ОК. Я работал над лучшим решением для вас и добавил к моему ответу - дайте мне знать, если это поможет. – Aidenhjj

+0

Это большая помощь. Спасибо. – Ayushi

Смежные вопросы