Jc嘻嘻 发表于 2017-9-16 14:10:39

C语言fopen的,fget,读取类型。

本帖最后由 Jc嘻嘻 于 2017-9-16 16:20 编辑

大家好,
我想打开我这个txt文件。

1503251369.691375      84:1b:5e:a8:bf:7f      68:94:23:4b:e8:35      100
1503251374.195670      00:8e:f2:c0:13:cc      00:11:d9:20:aa:4e      397
1503251374.205047      00:8e:f2:c0:13:cc      00:11:d9:20:aa:4e      397
1503251374.551604      00:8e:f2:c0:13:cc      00:11:d9:20:aa:4e      157
1503251375.551618      84:1b:5e:a8:bf:7c      cc:3a:61:df:4b:61      37
1503251375.552697      84:1b:5e:a8:bf:7c      cc:3a:61:df:4b:61      37
1503251375.553957      84:1b:5e:a8:bf:7c      cc:3a:61:df:4b:61      37
1503251375.555332      84:1b:5e:a8:bf:7c      cc:3a:61:df:4b:61      37
1503251375.556352      84:1b:5e:a8:bf:7c      cc:3a:61:df:4b:61      37
1503251375.557708      84:1b:5e:a8:bf:7c      cc:3a:61:df:4b:61      37
1503251375.558756      84:1b:5e:a8:bf:7c      cc:3a:61:df:4b:61      37
1503251376.426893      74:e2:f5:17:96:89      84:1b:5e:a8:bf:7f      82
1503251376.428309      84:1b:5e:a8:bf:7f      74:e2:f5:17:96:89      82
1503251376.478479      74:e2:f5:17:96:89      84:1b:5e:a8:bf:7c      28
1503251376.528461      74:e2:f5:17:96:89      84:1b:5e:a8:bf:7c      28
1503251377.059249      84:1b:5e:a8:bf:7f      74:e2:f5:17:96:89      106
1503251377.174706      84:1b:5e:a8:bf:7f      74:e2:f5:17:96:89      106
1503251377.879405      84:1b:5e:a8:bf:7f      74:e2:f5:17:96:89      100
1503251377.880309      84:1b:5e:a8:bf:7f      74:e2:f5:17:96:89      329
1503251377.880362      84:1b:5e:a8:bf:7f      74:e2:f5:17:96:89      106


中间空格由"\t" 隔开。
我需要做到的是,将第二行三行名字一样的全部提取出来并将对应的第四行汇总。
目前我已经可以将第二行所有不重复的名字提取出来。
我的问题是,我用了fopen打开的文件,用了fget读取的每一行,所以每一行都是字符串。我如何将第四行的数加起来。这里C会把它们当成string来处理,我如何将它们和对应的第二三列的名字加起来。
如何可以的话能否给我解释一下其中类型的变化?txt文件没打开之前数据是什么类型,用fget打开之后是不是都是字符串。 我如何将字符串变为int并放入二维数组对应相加减! 求助
下面是我需要达到的效果,和我目前写的代码。
题目要求用 /usr/bin/sort 和 fork()来完成最后的排序,我在网上搜了这两个。理解意思,但是真搞不懂如何用进去.


这是目前的结果
Ljc:Desktop killkelly214$ mycc -o test fopen1.cLjc:Desktop killkelly214$ ./test84:1b:5e:a8:bf:7f00:8e:f2:c0:13:cc84:1b:5e:a8:bf:7c74:e2:f5:17:96:89Ljc:Desktop killkelly214$
这是我想要的结果:
00:8e:f2:c0:13:cc   951
84:1b:5e:a8:bf:7f   929
84:1b:5e:a8:bf:7c   259
74:e2:f5:17:96:89      138
目前的代码#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>


int main (int argc, char *argv[])   //*argv[] pointer array
{
    FILE *fp= fopen("sample-packets.txt","r");   

    char line;//建立一个很大的数组
    char copy={{0}};//准备将txt文件中的类容存入copy二维数组
    char tMac={{0}}; //an array to collect the transmiter
    char rMac={{0}};
    char stat={{0}};
   
   
    int row=0;
    int column=0;
    int maxlength=0;
    int trl=0; // tMac row length
    int rrl=0; // rMac row length

    //fgets(array_name,n,file_name)
    // fgets, read a string from a specfied file to a array
   
    while( fgets(line, sizeof line, fp) != NULL)
    {
      int length = strlen(line);
      if(length > maxlength)
      {
            maxlength =length;
      }
      for (column=0;column<length;column++)
      {
            copy=line;
      }
      row++;
      
    }
   
   
    int indexOft;
    int indexOfr;
    int indexOfs;
    for(int i=0; i < row;i++)
    {   int j=0;
      int tcNum=0; // column number of tMac
      int rcNum=0; // column number of rMac
      int scNum=0; // column number of stat
      while(copy!='\t')
      {      
                j++;
      }
      indexOft = j;
      j+=1;      
      
      while(copy!='\t')
      {
            tMac=copy;
            j++;
            tcNum++;
      }
      trl=tcNum;
      j+=1;
      indexOfr=j;
      
      while(copy!='\t')
      {
            rMac=copy;
            j++;
            rcNum++;
      }
      rrl=rcNum;
      j+=1;
      indexOfs=j;
      
      while(copy!='\n')
      {
            stat=copy;
            j++;
            scNum++;
      }
      
      
    }// end copying new array

    char dt;   //distinct array
    int dNum = 1; //distinct row number
   
    //the first row of dt is the first row of tMac;
   
    //pass the first row to distinct array
    for(int i = 0;i<trl;i++)
    {
            dt=tMac;
            printf("%c",tMac);
    }
   
    printf("\n");

    for(int i = 0; i<row; i++)   //travesal each row
    {
            int identify = 1;//declare an number to show distinct row existed

      for(int e = 0;e < dNum;e++) //traversal each distinct row
      {
                identify=1;
                int deter={0};
                for(int g=0;g<trl;g++)//to judge if the coming row is same as existed distinct row,
                {
                        if(dt == tMac)
                        {      
                              deter = 1;
                        }
                }
      //      fprintf(stderr, "I'm here %d %d\n", e, dNum);    buffered-from your program to a buffer, but printf just print in the program.
      //      stderr is a file pointer, stdout,
                for(int g=0;g<trl;g++)
                {
                        if(deter != 1)
                        {      
                              identify = 0;
                        }
                }               
                if(identify == 1)//if the coming row is as same as existed row, traveral next row.
                {
                        break;
                }

      }
                if(identify == 0) //if not the same, pass the coming row into distinct array, distinct array +1
                {
                        dNum = dNum +1;

                        for(int g = 0;g<trl;g++)
                        {
                              dt = tMac;
                              printf("%c",dt);
                        }
                        printf("\n");
               
                }
                        
   
         }
   
   
    fclose(fp);
    return 0;
}


求助,后面的数字应该如何加起来并且排序! 跪求帮助!

边城 发表于 2017-9-16 14:55:29

不会C,水一下,用python
a = pd.read_table(r'D:\123.txt',names=list('abcd'))
a.pivot_table('d',index='b',aggfunc='sum').sort_valuse(by='d')

Jc嘻嘻 发表于 2017-9-16 15:16:22

边城 发表于 2017-9-16 14:55
不会C,水一下,用python
a = pd.read_table(r'D:\123.txt',names=list('abcd'))
a.pivot_table('d',ind ...

兄弟你别搞事好吧。

上善若水··· 发表于 2017-9-16 16:15:48

这里我没有用你的方式,下面是运行结果
C:/Users/Administrator/Desktop/1.png
// TestFile.cpp : 定义控制台应用程序的入口点。
//

#include "stdafx.h"
#include <string>
#include <iostream>

using namespace std;

int _tmain(int argc, _TCHAR* argv[])
{
        // 这里写的决对路径
        FILE *fp = fopen("E:\\ProcedureTest\\EncryptAndDecrypt\\TestPrc\\TestFile\\Debug\\File.txt", "r");

        // 建立数组
        char line;
        string strTmac, strRmac;
        int nStat = { 0 };
        int row = 0;

        while (fgets(line, sizeof(line), fp) != NULL)
        {
                string strLine(line);
                // 取出数据,分为三组,第二列,第三列,第四列
                int nIndex = strLine.find_last_of('\t');
                // 取第四列
                string strStat = strLine.substr(nIndex + 1, strLine.length() - nIndex - 2);       
                // 转换为整数
                nStat = atoi(strStat.c_str());
                // 取第三列
                strLine = strLine.substr(0, nIndex);
                nIndex = strLine.find_last_of('\t');
                strRmac = strLine.substr(nIndex + 1, strLine.length() - nIndex - 1);
                // 取第二列
                strLine = strLine.substr(0, nIndex);
                nIndex = strLine.find_last_of('\t');
                strTmac = strLine.substr(nIndex + 1, strLine.length() - nIndex - 1);
                row++;
        }

        int nResult = {0};
        string strTResult;
        string strRResult;
        int nCount = 0;

        for (int i = 0; i < row; i++)
        {
                if (strTmac.empty())
                {
                        continue;
                }
                for (int j = 0; j < row; j++)
                {
                        // 除去自身
                        if (i == j || strTmac.empty())
                                continue;
                        // 判断二、三列是否相等
                        if (strTmac == strTmac && strRmac == strRmac)
                        {
                                int k = 0;
                                bool bIsEqual = false;
                                for (; k < nCount; k++)
                                {
                                        if (strTResult == strTmac)
                                        {
                                                nResult += nStat;
                                                strTmac = "";
                                                bIsEqual = true;
                                        }
                                }
                                if (!bIsEqual)
                                {
                                        // 说明保存结果里并没有
                                        strTResult = strTmac;
                                        strRResult = strRmac;
                                        strTmac = "";
                                        nStat += nStat;
                                        nResult = nStat;
                                        nCount++;
                                }
                        }
                }       
        }
        for (int i = 0; i < nCount; i++)
        {
                cout << "TMac :" << strTResult << " RMac:" << strRResult << " value:" << nResult << endl;
        }
        getchar();
        return 0;
}

Jc嘻嘻 发表于 2017-9-16 16:18:58

上善若水··· 发表于 2017-9-16 16:15
这里我没有用你的方式,下面是运行结果

大神,不好意思我忘了。。题目要求必须用/usr/bin/sort 和 fork()这样来排序。。我真的搞不太明白

上善若水··· 发表于 2017-9-16 16:27:06

Jc嘻嘻 发表于 2017-9-16 16:18
大神,不好意思我忘了。。题目要求必须用/usr/bin/sort 和 fork()这样来排序。。我真的搞不太明白

好吧,不过都差不多,处理方式都是一样的。不清楚字符与数字的区别,可以在网上找点资料看下。刚刚那个结果图没传上,再传一下!

cyndiwants 发表于 2017-9-17 15:48:56

我也不会,不过顶楼主,祝你早日解决

cyndiwants 发表于 2017-9-17 15:57:19

谢谢楼主大大的分享

cyndiwants 发表于 2017-9-17 15:58:01

if you study hard,you will make great progress

cyndiwants 发表于 2017-9-18 11:25:58

谢谢分享,哈哈

小小小菜菜菜 发表于 2018-12-20 16:00:30

谢谢楼主分享

1809228982 发表于 2018-12-21 14:00:36

这么深奥的吗??{:10_261:}

X用户 发表于 2018-12-21 16:32:32

顶顶
页: [1]
查看完整版本: C语言fopen的,fget,读取类型。