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;
}
求助,后面的数字应该如何加起来并且排序! 跪求帮助!
不会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') 边城 发表于 2017-9-16 14:55
不会C,水一下,用python
a = pd.read_table(r'D:\123.txt',names=list('abcd'))
a.pivot_table('d',ind ...
兄弟你别搞事好吧。 这里我没有用你的方式,下面是运行结果
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;
}
上善若水··· 发表于 2017-9-16 16:15
这里我没有用你的方式,下面是运行结果
大神,不好意思我忘了。。题目要求必须用/usr/bin/sort 和 fork()这样来排序。。我真的搞不太明白 Jc嘻嘻 发表于 2017-9-16 16:18
大神,不好意思我忘了。。题目要求必须用/usr/bin/sort 和 fork()这样来排序。。我真的搞不太明白
好吧,不过都差不多,处理方式都是一样的。不清楚字符与数字的区别,可以在网上找点资料看下。刚刚那个结果图没传上,再传一下! 我也不会,不过顶楼主,祝你早日解决 谢谢楼主大大的分享 if you study hard,you will make great progress 谢谢分享,哈哈 谢谢楼主分享 这么深奥的吗??{:10_261:} 顶顶
页:
[1]