zoukankan      html  css  js  c++  java
  • LinuxC语言读取文件,分割字符串,存入链表,放入另一个文件

    //file_op.c

    #include <string.h> 
    #include <stdio.h> 
    #include <stdlib.h> 
    struct info{ 
      int id; 
      char name[10]; 
      char sex[10]; 
      char col[10]; 
      char sub[15]; 
      char marks[20]; 
      struct info * prev; 
      struct info * next; 
    }; 
    typedef struct info *st; 
    static st head = NULL;//链表头指针 
    #define PRINT_ST(str)  
      "info:id=%d; name=%s; sex=%s;col=%s; sub=%s; marks=%s
    ", 
      str->id,str->name, str->sex,str->col, str->sub, str->marks 
    int temp = 1; 
    int break_up(char *buffer);//分割字符串函数 
    int put_in(char* str[]);//放入结构体 
    int print_st(st str);//输出结构体,测试用 
    char * char_filter( char *str);//去掉行末回车符 
    int insert_list(st p);//插入链表 
    int main(void) 
    { 
      FILE *stream; 
      char msg[100]; 
      char backup[100]; 
      st p1, p2; 
      /* open a file for update */ 
      stream = fopen("file.txt","r"); 
      /* seek to the start of the file */ 
      fseek(stream, 0, SEEK_SET);//指针指向文件头部 
      /*备份第一行内容*/ 
      fgets(msg, 100, stream) != NULL; 
      strcpy(backup, msg); 
      /* 从第二行开始去数据 */ 
      while( fgets(msg, 100, stream) != NULL) 
      { 
        printf("%s",msg); 
        break_up(msg); 
        memset(msg, 0, sizeof(msg)); 
      } 
      /*先读取一行内容,测试用 
         fgets(msg, 100, stream) != NULL; 
         printf("%s",msg); 
         break_up(msg); 
         */ 
      fclose(stream); 
       /*正序输出链表,测试用*/ 
      p1 = head; 
      puts("
    "); 
      while( p1 != NULL) 
      { 
        print_st(p1); 
        p1 = p1->next;   
      } 
      /*倒序输出链表,测试用*/ 
      p1 = head; 
      puts("
    "); 
      while(p1 != NULL) 
      { 
        p2 = p1; 
        p1 = p1->next; 
      } 
      while(p2 != NULL) 
      { 
        print_st(p2); 
        p2 = p2->prev; 
      } 
       
      /*下面新建文件,倒叙输出到一个新文件new.txt里面*/ 
      stream = fopen("new.txt","w+"); 
      if(fputs(backup, stream) < 0) 
        { 
          perror("fputs error:"); 
        } 
      p1 = head; 
      while(p1 != NULL) 
      { 
        p2 = p1; 
        p1 = p1->next; 
      } 
      while(p2 != NULL) 
      { 
        snprintf(msg, sizeof(msg), PRINT_ST(p2)); 
        printf("test_char:%s
    ",msg); 
        fputs(msg, stream); 
        p2 = p2->prev; 
      } 
       
      fclose(stream);   
       
      /*释放链表*/ 
      p1 = head->next; 
      while (p1 != NULL) 
      {   
        p2 = p1; 
        p1 = p1->next; 
        free(p2); 
      } 
      free(head); 
      head = NULL; 
      return 0; 
    } 
    /*分割字符串*/ 
    int break_up(char *buffer) 
    { 
      int i = 0, j = 0; 
      char *p[20]= {NULL}; 
      char *buf=buffer; 
      char *outer_ptr=NULL; 
      char *inner_ptr=NULL; 
      while((p[i]=strtok_r(buf,";",&outer_ptr))!=NULL)  
      { 
        i++; 
        buf=NULL;  
      } 
    //  printf("Here we have %d strings
    ",i);//测试用 
      for(j=0 ; j<i; j++) 
      { 
        printf("%s
    ",p[j]);//输出分割字符串,测试用 
      } 
      put_in(p); 
      return 0; 
    } 
    /*放入结构体*/ 
    int put_in(char* str[]) 
    { 
      st st1 = (st)malloc(sizeof(struct info)); 
      st1->id = atoi(str[0]); 
      strcpy(st1->name, str[1]); 
      strcpy(st1->sex, str[2]); 
      strcpy(st1->col, str[3]); 
      strcpy(st1->sub, str[4]); 
      str[5] = char_filter(str[5]); 
      strcpy(st1->marks, str[5] ); 
      st1->next = NULL; 
      st1->prev = NULL; 
      print_st(st1); 
      if(temp == 1) 
      { 
        head = st1; 
        temp++;   
        return 0; 
      } 
      insert_list(st1); 
      return 0; 
    } 
    int print_st(st str)// 
    { 
    /*  printf("info:id=%d; name=%s; sex=%s; col=%s; sub=%s; marks=%s
    ", 
          str->id,str->name, str->sex, str->col, str->sub, str->marks); 
          */ 
      printf(PRINT_ST(str)); 
    }   
    char *char_filter( char *str) 
    { 
      int i = strlen(str); 
      *(str + i - 1) = ''; 
      return str; 
    } 
    int insert_list(st p) 
    { 
       
      st q = head; 
      while( q->next != NULL) 
      { 
        q = q->next; 
      } 
      q->next = p; 
      p->prev = q; 
      return 0; 
    } 

    ===================================

    file.txt 内容

    ID;NAME;SEX;COLLEGE;SUBJECT;REMARKS 
    1;jean;male;electron;communicate;no marks 
    2;luce;female;legal;legal;thanks 
    3;devide;male;building;build;remarks 
    4;liulian;female;business;business;arm

    ===============================================

    程序输出:

    1;jean;male;electron;communicate;no marks 

    jean 
    male 
    electron 
    communicate 
    no marks

    info:id=1; name=jean; sex=male;col=electron; sub=communicate; marks=no marks 
    2;luce;female;legal;legal;thanks 

    luce 
    female 
    legal 
    legal 
    thanks

    info:id=2; name=luce; sex=female;col=legal; sub=legal; marks=thanks 
    3;devide;male;building;build;remarks 

    devide 
    male 
    building 
    build 
    remarks

    info:id=3; name=devide; sex=male;col=building; sub=build; marks=remarks 
    4;liulian;female;business;business;arm 

    liulian 
    female 
    business 
    business 
    arm

    info:id=4; name=liulian; sex=female;col=business; sub=business; marks=arm

    info:id=1; name=jean; sex=male;col=electron; sub=communicate; marks=no marks 
    info:id=2; name=luce; sex=female;col=legal; sub=legal; marks=thanks 
    info:id=3; name=devide; sex=male;col=building; sub=build; marks=remarks 
    info:id=4; name=liulian; sex=female;col=business; sub=business; marks=arm

    info:id=4; name=liulian; sex=female;col=business; sub=business; marks=arm 
    info:id=3; name=devide; sex=male;col=building; sub=build; marks=remarks 
    info:id=2; name=luce; sex=female;col=legal; sub=legal; marks=thanks 
    info:id=1; name=jean; sex=male;col=electron; sub=communicate; marks=no marks 
    test_char:info:id=4; name=liulian; sex=female;col=business; sub=business; marks=arm

    test_char:info:id=3; name=devide; sex=male;col=building; sub=build; marks=remarks

    test_char:info:id=2; name=luce; sex=female;col=legal; sub=legal; marks=thanks

    test_char:info:id=1; name=jean; sex=male;col=electron; sub=communicate; marks=no marks

  • 相关阅读:
    hdu 5224 Tom and paper 水题
    2015 UESTC 搜索专题N题 韩爷的梦 hash
    2015 UESTC 搜索专题M题 Palindromic String 马拉车算法
    2015 UESTC 搜索专题K题 秋实大哥の恋爱物语 kmp
    2015 UESTC 搜索专题J题 全都是秋实大哥 kmp
    2015 UESTC 搜索专题F题 Eight Puzzle 爆搜
    2015 UESTC 搜索专题E题 吴队长征婚 爆搜
    2015 UESTC 搜索专题D题 基爷的中位数 二分
    2015 UESTC 搜索专题C题 基爷与加法等式 爆搜DFS
    2015 UESTC 搜索专题B题 邱老师降临小行星 记忆化搜索
  • 原文地址:https://www.cnblogs.com/aspirant/p/3550330.html
Copyright © 2011-2022 走看看