C#从txt中读取其中几行的数据

C#从txt中读取数据,txt文档中只有一列数据,读取中间的几行

2个回答

读出来Split一下就行了,然后读取那几行直接取下标(从0开)


        string[] arr = System.IO.File.ReadAllText("txt文件物理路径", System.Text.Encoding.UTF8).Split('\n');//如果不是utf-8编码存储ReadAllText的去掉第二个System.Text.Encoding.UTF8参数
        //arr[0],第一行数据,arr[1]第二行。。依次类推
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
从数组中读取的数据无效
报错:table中读取的数据无效 分析了一下代码,应该是我运行代码的时候出现了table【-2】 我的问题:一个m_*n的矩阵,假设其中一个元素为(m,n) 怎样遍历以(m,n)为中心的“十字”的元素? ps:附上源码_ ``` #include<stdio.h> int m, n; int count = 1; int i, j; int p, q;//数十字格 int ray;//周围雷的个数 char table[100][100]; char result[100][100]; main() { FILE* fp; freopen_s(&fp, "in.txt", "r", stdin); freopen_s(&fp, "out.txt", "w", stdout); while (scanf_s("%d %d", &m, &n) != EOF) { printf("FILED#%d\n", count); for (i = 0;i < m;i++) { for (j = 0;j < n;j++) { scanf_s("%s", &table[i][j],100); } } for (i = 0;i < m;i++) { for (j = 0;j < n;j++) { if (table[i][j] == "*") { result[i][j] = "*"; } else { for (p = i - 2;p<= i + 2;p++) { for (q = j - 2;q <= j + 2;q++) { if (table[p][q] == "*") { ray = ray + 1; } } result[i][j] = ray; } } } } count = count + 1; } } ```
SCIK Ranger3得到了3D图像数据以二进制格式保存到了计算机中,将二进制文件读取成文本文件的格式,读取后数据有问题
计算机从相机中得到了两个文件 1.包含图像数据的二进制文件 2.用于描述二进制文件的 XML 文件 ![图片说明](https://img-ask.csdn.net/upload/202003/08/1583651424_811484.png) 其中xml文件内容如下: ![图片说明](https://img-ask.csdn.net/upload/202003/08/1583651611_816750.png) 我将数据读出来,发现有些数据特别大,有些又特别小 ![图片说明](https://img-ask.csdn.net/upload/202003/08/1583654207_110922.png) ![图片说明](https://img-ask.csdn.net/upload/202003/08/1583654231_930386.png) 请问需要怎么改进 代码如下: ``` #include<iostream> #include <fstream> #include <string> #include<vector> using namespace std; void DataRead_CPPMode(string path); int main() { string path;//文件路径 path = "img-0.dat"; DataRead_CPPMode(path); system("pause"); return 0; } /* 读二进制文件 path: 文件路径 */ void DataRead_CPPMode(string path) { //每次读取3个 double pos_in[3]; ifstream infile(path, ios::binary); if (!infile) { cout << "读取文件失败" << endl; return; } //写出 ofstream outfile("dianyun.txt"); if (!outfile) { cerr << "open error!" << endl; exit(1); } while (!infile.eof()) { infile.read((char*)pos_in, 3 * sizeof(double)); for (int i = 0; i < 3; i++) { cout << pos_in[i] << "\t"; outfile << pos_in[i] << "\t"; } cout << endl; outfile << endl; } infile.close(); outfile.close(); } ```
C++随机读取文件,不用getline()函数怎么做
在文件保存数据,文件名为inputfile.txt,文件中的数据格式为: (a,n)…(a,n)(0,0) (a,n)…(a,n)(0,0) AND(#,#) 其中,a是double型数据,n是int型数据,两数之间使用逗号分隔,并用括号括起来。随机读取文件,要求以(0,0)分别作为第一次和第二次读取的结束。以(#,#)作为全部数据读取的结束标志。不用getline()函数,怎么做;
C# asp.net web窗体 timer控件还有FileSystemWatcher无法修改页面
就是在HTML界面按下一个button后,想实现数据输入,用线程处理,最后返回结果,但是输入处理都没问题,就是无法把结果返回到界面上,连想修改一个textbox里的text也无法做到,刷新也咩有用··· ps:有更好的办法判断线程输出已完成,我之前用timer莫名其妙就是无法跳入tick事件里面;用FileSystemWatcher可以触发事件,但是因为是流输出,有多少行数据就会触发多少回,还会影响到输出。有木有一次性输出的··· 代码如下: ``` //提交当前行 protected void Button2_Click(object sender, EventArgs e) { // if (FileUpload1.HasFile) { FileUpload1.SaveAs(Server.MapPath("upload") + "//" + FileUpload1.FileName); //exceldata是一个datatable,LoadDataFromExcel函数是读取Excel文件返回datatable exceldata = LoadDataFromExcel(Server.MapPath("upload") + "//" + FileUpload1.FileName); //make_table(); //显示输入结果 GridView1.DataSource = exceldata; GridView1.DataBind(); //调用FileSystemWatcher的函数 find_out_end("M:\\", "*.txt"); //调用timer //timer1.Enable=true;//之前尝试用timer来修改界面也不成功 } else { TextBox4.Text = "nofile"; } } ``` 其中FileSystemWatcher的触发后的函数: ``` public void OnProcess(object source, FileSystemEventArgs e) { TextBox5.Text = "end";//textbox5是web界面上的一个textbox,但是结果就是不显示,刷新也不行;加断点有路过这句话,但是界面就是没有反应 } ```
关于c语言从文件中读取学生信息,处理并打印
![图片说明](https://img-ask.csdn.net/upload/201712/07/1512617928_774992.png) b) 建议函数流程: i. 打开数据文件,失败返回-1; ii. 从头到尾扫描数据文件(即预读一遍)获得学生人数; iii. 根据学生人数,利用malloc和sizeof等函数或运算符为struct student** pStudents分配内存; iv. 利用rewind函数,定位到文件头; v. 读取数据文件,并把每一条记录通过数组下标法或指针法保存到结构体数组pStudents中; vi. 关闭文件; vii. 返回学生人数。 c) 数据文件格式说明: 一行一条学生信息的记录,不同属性用空格隔开,输入数据中无总成绩记录,例如: 张三 通信 89 93 95 李四 网络 88 91 94 王五 物联网 71 94 88 3. 编写统计函数: a) 函数定义void Count(struct student pStudents[], int num)。输入参数分别为保存学生的结构体数组和学生人数。 b) 功能为:统计所有学生的总成绩和每个专业(假定一共三个专业:通信,网络,物联网)的平均成绩;输入参数包括学生信息结构体数组,学生人数,返回的每个学生的总成绩直接填充到对应的输入结构体数组对应字段中。统计信息包括三个专业的总人数、平均成绩数组,用全局变量来表示。访问每个学生信息的时候,用指针来指向当前正在处理的学生。 c) 设计一个或者三个带参数的宏,判断输入的字符串是否是指定的专业名称,并在函数Count中使用。 5. 编写main函数实现: a) 定义变量,其中保存学生信息的数据文件直接在源代码中初始化; b) 读取学生信息,如果失败,打印失败信息并退出程序; c) 统计学生信息; d) 输出统计信息。 e) 释放内存。 ``` #include <stdio.h> #include <stdlib.h> #include <string.h> struct student{ char name[15]; char major[15]; int Eng_sco; int cal_sco; int c_sco; int sum; }; int tx_per=0,tx_ave,tx_sum=0; int wl_per=0,wl_ave,wl_sum=0; int wlw_per=0,wlw_ave,wlw_sum=0; int ReadStudentInfo(const char* filename, struct student** pStudents); void Count(struct student pStudents[], int num); int main() { int count; int m; struct student *list; count=ReadStudentInfo("readme.txt", &list); printf("学生信息: \n"); printf("----------------------------------------------------\n"); printf("序号 姓 名 专业名称 英语成绩 线性代数成绩 c语言成绩 总成绩\n"); for(m=1;m<=count;m++) { printf("%4d %s %s %4d %4d %4d %4d\n",m,(list+m-1)->name,(list+m-1)->major,(list+m-1)->Eng_sco,(list+m-1)->cal_sco,(list+m-1)->c_sco,(list+m-1)->sum); } Count(list, count); printf("\n统计信息 :\n"); printf("----------------------------------------------------\n"); printf("序号 专业名称 学生人数 平均成绩\n"); printf(" 1 通信 %d %d\n",tx_per,tx_ave); printf(" 2 网络 %d %d\n",wl_per,wl_ave); printf(" 3 物联网 %d %d\n",wlw_per,wlw_ave); return 0; } int ReadStudentInfo(const char* filename, struct student** pStudents) { FILE *fp; char ch; int i=1,j; fp=fopen(readme.txt,"r"); if(fp==NULL) { printf("cann't open the file"); exit(-1); } ch=fgetc(fp); while(ch!=EOF) { if(ch=='\n') { i++; } ch=fgetc(fp); } rewind(fp); *pStudents=(struct student*)malloc(sizeof(** pStudents)*i); for(j=0;j<i;j++) { fread(&*pStudents[j],sizeof(struct student)-sizeof(int),1,fp); (*pStudents+j)->sum=((*pStudents+j)->Eng_sco+(*pStudents+j)->cal_sco+(*pStudents+j)->c_sco); } fclose(fp); return i; } void Count(struct student pStudents[], int num) { int n=1; for(n=1;n<=num;n++) { if(!strcmp((pStudents+n-1)->major,"通信")) { tx_per++; tx_sum=tx_sum+(pStudents+n-1)->sum; } if(!strcmp((pStudents+n-1)->major,"网络")) { wl_per++; wl_sum=wl_sum+(pStudents+n-1)->sum; } if(!strcmp((pStudents+n-1)->major,"物联网")) { wlw_per++; wlw_sum=wlw_sum+(pStudents+n-1)->sum; } tx_ave=tx_sum/tx_per; wl_ave=wl_sum/wl_per; wlw_ave=wlw_sum/wlw_per; } free(pStudents); } ``` 运行不起来,是哪里出问题了?
修改程序:信源编解码(c语言)
修改程序:问题1。源文件source文本空间太长汉字太多无法运行2,未按频度要求排序 问题描述: 信源编解码是通信系统的重要组成部分。本实验旨在通过程序设计实现基于哈夫曼编码的信源编解码算法。程序具备以下功能: 对于给定的源文档 SourceDoc.txt, 1) 统计其中所有字符的频度(某字符的频度等于其出现的总次数除以总字符数) , 包括字母(区分大小写) 、标点符号及格式控制符(空格、回车等) 。 2) 按频度统计结果生成哈夫曼编码码表。 3) 基于哈夫曼码表进行编码,生成对应的二进制码流,并输出到文件 Encode.dat。 4) 对二进制码流进行哈夫曼解码,把结果输出到文件 DecodeDoc.txt。 5) 判断DecodeDoc.txt与SourceDoc.txt内容是否一致,以 验证编解码系统的正确性。 要求: 1) 用 C 语言实现。 2) 用子函数实现各功能模块。 3) 输出文件 Statistic.txt,包含的信息有:按频度大小排序的字符表,及各字符出现 的次数、频度及哈夫曼编码。 4) 应至少包含链表、二叉树的数据结构。 5) 不能用冒泡排序算法。 #include<stdio.h> #include<stdlib.h> #include<string.h> #include<sys/stat.h> #include<sys/types.h> #include<fcntl.h> #include<unistd.h> #include<errno.h> #define N 10000 int count = 0; //每增加一个新的字符, count增加1, 可表示a中的字符种类数, 也即哈夫曼树叶子点个数 /*定义哈夫曼树结构体*/ typedef struct HuffmanTree{ int weight; int parent; int Lchild; int Rchild; }HuffmanTree[2*N]; /*定义储存字符及其出现次数的结构体*/ typedef struct DifferentCharacter{ char char_date; int num; //相同字符出现的次数 char a_code[100]; //每种字符对应的编码 }difcha[N]; /*在一定范围内选择两个weight最小的结点, 并将两个结点的序号赋给s1, s2*/ void select_two(HuffmanTree ht, int j, int *s1, int *s2) { int i = 1, temp; int min1 = 0, min2 = 0; while( (ht[i].parent != 0) && (i <= j) ) i++; *s1 = i; min1 = ht[i++].weight; while( (ht[i].parent != 0) && (i <= j) ) i++; *s2 = i; min2 = ht[i++].weight; if(min1 > min2){ temp = min1; min1 = min2; min2 = temp; } for(; i <= j; i++){ //遍历parent不为0的结点 if(ht[i].parent != 0) continue; if(ht[i].weight <= min1){ min2 = min1; min1 = ht[i].weight; *s2 = *s1; *s1 = i; } else if( (ht[i].weight < min2) && (ht[i].weight > min1) ) { min2 = ht[i].weight; *s2 = i; } } } /*建哈夫曼树*/ void EstHuffmanTree(HuffmanTree ht, int *w, int n){ int i; int s1 = 0, s2 = 0; for(i = 1; i <= n; i++){ //初始化哈夫曼树, 前n个单元存放叶子点 ht[i].weight = w[i]; ht[i].parent = 0; ht[i].Lchild = 0; ht[i].Rchild = 0; } for(i = n+1; i <= 2*n-1; i++){ //后n-1个单元存放非叶子点 ht[i].weight = 0; ht[i].parent = 0; ht[i].Lchild = 0; ht[i].Rchild = 0; } for(i = n+1; i <= 2*n-1; i++){ select_two(ht, i-1, &s1, &s2); //创建非叶子点, 建立哈夫曼树, 每次在ht[1]~ht[i-1]范围内选两个最小的weight结点,并将其序号赋给s1, s2 ht[i].weight = ht[s1].weight + ht[s2].weight; ht[i].Lchild = s1; ht[i].Rchild = s2; ht[s1].parent = i; ht[s2].parent = i; } //哈夫曼树建立完毕 } /*求哈弗曼编码*/ void CrtHuffmanCode(HuffmanTree ht, char **hcd, int n){ int start = 0, c = 0, p = 0, i; char *cd = (char*)malloc(n*sizeof(char)); //分配求当前编码的工作空间 cd[n-1] = '\0'; //从左向右存放编码 for(i = 1; i <= n; i++) { start = n-1; //初始化编码起始指针 c = i; p = ht[i].parent; while(p != 0){ start--; if(ht[p].Lchild == c) cd[start] = '0'; //左分支标0 else cd[start] = '1'; //右分支标1 c = p; //向上倒推 p = ht[c].parent; } hcd[i] = (char*)malloc((n-start)*sizeof(char)); strcpy(hcd[i], &cd[start]); } free(cd); } /*自定义错误处理函数*/ void my_err(char *err_string, int line){ printf("Line %d:\n", line); perror(err_string); exit(1); } /*从 buf_read 中统计每个字符出现的次数,将次数作为该字符的权值*/ void Statistics(difcha a, char *buf_read){ int i, j = 0; for(i = 0; i < strlen(buf_read) ; i++){ //对buf_read中的字符遍历 for(j = 0; j < count; j++){ //检查是否是新的字符 if(a[j].char_date == buf_read[i]){ a[j].num++; //若是旧字符, 则num++; break; } } if(j == count){ //若是新字符, 则记录到a中, 且对应的num++ a[count].char_date = buf_read[i]; a[count].num++; count++; //更新count } } } /*从 SourceDoc.txt 读取数据到 buf_read */ void ReadFile(char *pathName, char *buf_read){ int fd_date; int len = 0; if( (fd_date = open(pathName, O_RDWR)) < 0) //以读写方式打开SourceDoc.txt文件 my_err("open SourceDoc.txt", __LINE__); if(lseek(fd_date, 0, SEEK_END) < 0) //获取文件长度,并保持文件读写指针在文件开始处 my_err("lseek", __LINE__); if( (len = lseek(fd_date, 0, SEEK_CUR)) < 0 ) my_err("lseek", __LINE__); if(lseek(fd_date, 0, SEEK_SET) < 0) my_err("lseek", __LINE__); if(read(fd_date, buf_read, len) > len) //从SourceDoc.txt中读取内容 my_err("read SourceDoc.txt", __LINE__); } /*将 buf_code 写入 Encode.dat 中*/ void WriteFile(char *pathName, char *buf_code){ int fd_code; if((fd_code = open(pathName, O_CREAT|O_TRUNC|O_RDWR, S_IRWXU)) < 0) //创建Encode.dat文件 my_err("open Encode.dat", __LINE__); if( write(fd_code, buf_code, strlen(buf_code)) != strlen(buf_code) ) //将 buf_code 写入Encode.dat my_err("write Encode.dat", __LINE__); } /*主函数*/ void main(){ char buf_read[N] = {'\0'}; char buf_code[N] = {'\0'}; char buf_yima[N] = {'\0'}; char *hcd[N]; char temp[50] = {'\0'}; difcha a; int i, j, n, k = 0, m = 0; int w[N] = {0}; HuffmanTree ht; ReadFile("SourceDoc.txt", buf_read); Statistics(a, buf_read); for(i = 0; i < count; i++) w[i+1] = a[i].num; EstHuffmanTree(ht, w, count); //建HuffmanTree CrtHuffmanCode(ht, hcd, count); //对树中字符进行编码 for(i = 1; i <= count; i++) //将每个字符对应的编码存入结构体 a 中 strcpy(a[i-1].a_code, hcd[i]); FILE *fp1; fp1=fopen("Statistic.txt","w"); for(i = 0; i < count; i++) //查看每个字符的权值和对应的编码 fprintf(fp1,"%c %d %s\n", a[i].char_date, a[i].num, a[i].a_code); fclose(fp1); for(i = 0; i < strlen(buf_read) ; i++){ //遍历 buf_read, 给 SourceDoc.txt 中每个字符匹配编码, 存入 buf_code 中 for(j = 0; j < count; j++){ if(buf_read[i] == a[j].char_date){ strcat(buf_code, a[j].a_code); break; } } if(j == count) //匹配异常 printf("Unknown Character: %c\n", buf_read[i]); } WriteFile("Encode.dat", buf_code); //将 buf_code 写入 Encode.dat 中 ReadFile("Encode.dat", buf_read); //从 Encode.dat 中读取全部编码 n = strlen(buf_read); for(i = 0; i < n; i++){ //为 Encode.dat 中的编码匹配字符 temp[k++] = buf_read[i]; for(j = 0; j < count; j++){ if(strcmp(temp, a[j].a_code) == 0){ buf_yima[m++] = a[j].char_date; break; } } if(j < count){ //匹配成功, 对 temp 初始化 for(;k > 0; k--) temp[k] = '\0'; } } FILE *fp2; fp2=fopen("DecodeDoc.txt","w"); fprintf(fp2,"%s", buf_yima); fclose(fp2); }
想用树莓派做行人识别,不知道可以吗
先在树莓派上装c++版的opencv,用板子上的csi摄像头采集图像,然后用HOG特征和SVM来检测其中的行人。不知道树莓派算力够吗? 想把这个程序写进去。 ``` #include <iostream> #include <fstream> #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <opencv2/objdetect/objdetect.hpp> #include <opencv2/ml/ml.hpp> using namespace std; using namespace cv; #define PosSamNO 1114 //正样本个数 #define NegSamNO 12180 //负样本个数 #define TRAIN true//是否进行训练,true表示重新训练,false表示读取xml文件中的SVM模型 #define CENTRAL_CROP false //true:训练时,对96*160的INRIA正样本图片剪裁出中间的64*128大小人体 //HardExample:负样本个数。如果HardExampleNO大于0,表示处理完初始负样本集后,继续处理HardExample负样本集。 //不使用HardExample时必须设置为0,因为特征向量矩阵和特征类别矩阵的维数初始化时用到这个值 #define HardExampleNO 433 //继承自CvSVM的类,因为生成setSVMDetector()中用到的检测子参数时,需要用到训练好的SVM的decision_func参数, //但通过查看CvSVM源码可知decision_func参数是protected类型变量,无法直接访问到,只能继承之后通过函数访问 class MySVM : public CvSVM { public: //获得SVM的决策函数中的alpha数组 double * get_alpha_vector() { return this->decision_func->alpha; } //获得SVM的决策函数中的rho参数,即偏移量 float get_rho() { return this->decision_func->rho; } }; int main() { //检测窗口(64,128),块尺寸(16,16),块步长(8,8),cell尺寸(8,8),直方图bin个数9 HOGDescriptor hog(Size(64,128),Size(16,16),Size(8,8),Size(8,8),9);//HOG检测器,用来计算HOG描述子的 int DescriptorDim;//HOG描述子的维数,由图片大小、检测窗口大小、块大小、细胞单元中直方图bin个数决定 MySVM svm;//SVM分类器 //若TRAIN为true,重新训练分类器 if(TRAIN) { string ImgName;//图片名(绝对路径) ifstream finPos("d:/hogmit/pos/pos.txt");//正样本图片的文件名列表 //ifstream finPos("PersonFromVOC2012List.txt");//正样本图片的文件名列表 ifstream finNeg("d:/hogmit/neg/neg.txt");//负样本图片的文件名列表 Mat sampleFeatureMat;//所有训练样本的特征向量组成的矩阵,行数等于所有样本的个数,列数等于HOG描述子维数 Mat sampleLabelMat;//训练样本的类别向量,行数等于所有样本的个数,列数等于1;1表示有人,-1表示无人 //依次读取正样本图片,生成HOG描述子 for(int num=0; num<PosSamNO && getline(finPos,ImgName); num++) { cout<<"处理:"<<ImgName<<endl; //ImgName = "D:\\DataSet\\PersonFromVOC2012\\" + ImgName;//加上正样本的路径名 ImgName = "d:/hogmit/pos/" + ImgName;//加上正样本的路径名 Mat src = imread(ImgName);//读取图片 if(CENTRAL_CROP) src = src(Rect(16,16,64,128));//将96*160的INRIA正样本图片剪裁为64*128,即剪去上下左右各16个像素 //resize(src,src,Size(64,128)); vector<float> descriptors;//HOG描述子向量 hog.compute(src,descriptors,Size(8,8));//计算HOG描述子,检测窗口移动步长(8,8) // cout<<"描述子维数:"<<descriptors.size()<<endl; //处理第一个样本时初始化特征向量矩阵和类别矩阵,因为只有知道了特征向量的维数才能初始化特征向量矩阵 if( 0 == num ) { DescriptorDim = descriptors.size();//HOG描述子的维数 //初始化所有训练样本的特征向量组成的矩阵,行数等于所有样本的个数,列数等于HOG描述子维数sampleFeatureMat sampleFeatureMat = Mat::zeros(PosSamNO+NegSamNO+HardExampleNO, DescriptorDim, CV_32FC1); //初始化训练样本的类别向量,行数等于所有样本的个数,列数等于1;1表示有人,0表示无人 sampleLabelMat = Mat::zeros(PosSamNO+NegSamNO+HardExampleNO, 1, CV_32FC1); } //将计算好的HOG描述子复制到样本特征矩阵sampleFeatureMat for(int i=0; i<DescriptorDim; i++) sampleFeatureMat.at<float>(num,i) = descriptors[i];//第num个样本的特征向量中的第i个元素 sampleLabelMat.at<float>(num,0) = 1;//正样本类别为1,有人 } //依次读取负样本图片,生成HOG描述子 for(int num=0; num<NegSamNO && getline(finNeg,ImgName); num++) { cout<<"处理:"<<ImgName<<endl; ImgName = "d:/hogmit/neg/" + ImgName;//加上负样本的路径名 Mat src = imread(ImgName);//读取图片 //resize(src,img,Size(64,128)); vector<float> descriptors;//HOG描述子向量 hog.compute(src,descriptors,Size(8,8));//计算HOG描述子,检测窗口移动步长(8,8) //cout<<"描述子维数:"<<descriptors.size()<<endl; //将计算好的HOG描述子复制到样本特征矩阵sampleFeatureMat for(int i=0; i<DescriptorDim; i++) sampleFeatureMat.at<float>(num+PosSamNO,i) = descriptors[i];//第PosSamNO+num个样本的特征向量中的第i个元素 sampleLabelMat.at<float>(num+PosSamNO,0) = -1;//负样本类别为-1,无人 } //处理HardExample负样本 if(HardExampleNO > 0) { ifstream finHardExample("d:/hogmit/hard/hard.txt");//HardExample负样本的文件名列表 //依次读取HardExample负样本图片,生成HOG描述子 for(int num=0; num<HardExampleNO && getline(finHardExample,ImgName); num++) { cout<<"处理:"<<ImgName<<endl; ImgName = "d:/hogmit/hard/" + ImgName;//加上HardExample负样本的路径名 Mat src = imread(ImgName);//读取图片 //resize(src,img,Size(64,128)); vector<float> descriptors;//HOG描述子向量 hog.compute(src,descriptors,Size(8,8));//计算HOG描述子,检测窗口移动步长(8,8) //cout<<"描述子维数:"<<descriptors.size()<<endl; //将计算好的HOG描述子复制到样本特征矩阵sampleFeatureMat for(int i=0; i<DescriptorDim; i++) sampleFeatureMat.at<float>(num+PosSamNO+NegSamNO,i) = descriptors[i];//第PosSamNO+num个样本的特征向量中的第i个元素 sampleLabelMat.at<float>(num+PosSamNO+NegSamNO,0) = -1;//负样本类别为-1,无人 } } //输出样本的HOG特征向量矩阵到文件 ofstream fout("d:/xlw/SampleFeatureMat.txt"); for(int i=0; i<PosSamNO+NegSamNO; i++) { fout<<i<<endl; for(int j=0; j<DescriptorDim; j++) { fout<<sampleFeatureMat.at<float>(i,j)<<" "; } fout<<endl; } //训练SVM分类器 //迭代终止条件,当迭代满1000次或误差小于FLT_EPSILON时停止迭代 CvTermCriteria criteria = cvTermCriteria(CV_TERMCRIT_ITER+CV_TERMCRIT_EPS, 1000, FLT_EPSILON); //SVM参数:SVM类型为C_SVC;线性核函数;松弛因子C=0.01 CvSVMParams param(CvSVM::C_SVC, CvSVM::LINEAR, 0, 1, 0, 0.01, 0, 0, 0, criteria); cout<<"开始训练SVM分类器"<<endl; double time0=static_cast<double>(getTickCount()); svm.train(sampleFeatureMat,sampleLabelMat, Mat(), Mat(), param);//训练分类器 time0=((double)getTickCount()-time0)/getTickFrequency(); cout<<"训练完成"<<endl; cout<<"训练花费时间:"<<time0<<endl; svm.save("d:/xlw/SVM_HOG_mit_inria(1114pos+12180neg+433hard).xml");//将训练好的SVM模型保存为xml文件 } else //若TRAIN为false,从XML文件读取训练好的分类器 { cout<<"fail train"<<endl; //svm.load("SVM_HOG_2400PosINRIA_12000Neg_HardExample(误报少了漏检多了).xml");//从XML文件读取训练好的SVM模型 svm.load("d:/LBP/SVM_Model.xml"); } /************************************************************************************************* 线性SVM训练完成后得到的XML文件里面,有一个数组,叫做support vector,还有一个数组,叫做alpha,有一个浮点数,叫做rho; 将alpha矩阵同support vector相乘,注意,alpha*supportVector,将得到一个列向量。之后,再该列向量的最后添加一个元素rho。 如此,变得到了一个分类器,利用该分类器,直接替换opencv中行人检测默认的那个分类器(cv::HOGDescriptor::setSVMDetector()), 就可以利用你的训练样本训练出来的分类器进行行人检测了。 ***************************************************************************************************/ DescriptorDim = svm.get_var_count();//特征向量的维数,即HOG描述子的维数 int supportVectorNum = svm.get_support_vector_count();//支持向量的个数 cout<<"支持向量个数:"<<supportVectorNum<<endl; Mat alphaMat = Mat::zeros(1, supportVectorNum, CV_32FC1);//alpha向量,长度等于支持向量个数 Mat supportVectorMat = Mat::zeros(supportVectorNum, DescriptorDim, CV_32FC1);//支持向量矩阵 Mat resultMat = Mat::zeros(1, DescriptorDim, CV_32FC1);//alpha向量乘以支持向量矩阵的结果 //将支持向量的数据复制到supportVectorMat矩阵中 for(int i=0; i<supportVectorNum; i++) { const float * pSVData = svm.get_support_vector(i);//返回第i个支持向量的数据指针 for(int j=0; j<DescriptorDim; j++) { //cout<<pData[j]<<" "; supportVectorMat.at<float>(i,j) = pSVData[j]; } } //将alpha向量的数据复制到alphaMat中 double * pAlphaData = svm.get_alpha_vector();//返回SVM的决策函数中的alpha向量 for(int i=0; i<supportVectorNum; i++) { alphaMat.at<float>(0,i) = pAlphaData[i]; } //计算-(alphaMat * supportVectorMat),结果放到resultMat中 //gemm(alphaMat, supportVectorMat, -1, 0, 1, resultMat);//不知道为什么加负号? resultMat = -1 * alphaMat * supportVectorMat; //得到最终的setSVMDetector(const vector<float>& detector)参数中可用的检测子 vector<float> myDetector; //将resultMat中的数据复制到数组myDetector中 for(int i=0; i<DescriptorDim; i++) { myDetector.push_back(resultMat.at<float>(0,i)); } //最后添加偏移量rho,得到检测子 myDetector.push_back(svm.get_rho()); cout<<"检测子维数:"<<myDetector.size()<<endl; //设置HOGDescriptor的检测子 HOGDescriptor myHOG; myHOG.setSVMDetector(myDetector); //myHOG.setSVMDetector(HOGDescriptor::getDefaultPeopleDetector()); //保存检测子参数到文件 ofstream fout("d:/xlw/HOGDetectorForOpenCV.txt"); for(int i=0; i<myDetector.size(); i++) { fout<<myDetector[i]<<endl; } /**************读入图片进行HOG行人检测******************/ Mat src = imread("d:/timg.png"); //Mat src = imread("2007_000423.jpg"); //Mat src = imread("1.png"); vector<Rect> found, found_filtered;//矩形框数组 cout<<"进行多尺度HOG人体检测"<<endl; myHOG.detectMultiScale(src, found, 0, Size(8,8), Size(32,32), 1.05, 2);//对图片进行多尺度行人检测 //src为输入待检测的图片;found为检测到目标区域列表;参数3为程序内部计算为行人目标的阈值,也就是检测到的特征到SVM分类超平面的距离; //参数4为滑动窗口每次移动的距离。它必须是块移动的整数倍;参数5为图像扩充的大小;参数6为比例系数,即测试图片每次尺寸缩放增加的比例; //参数7为组阈值,即校正系数,当一个目标被多个窗口检测出来时,该参数此时就起了调节作用,为0时表示不起调节作用。 cout<<"找到的矩形框个数:"<<found.size()<<endl; //找出所有没有嵌套的矩形框r,并放入found_filtered中,如果有嵌套的话,则取外面最大的那个矩形框放入found_filtered中 for(int i=0; i < found.size(); i++) { Rect r = found[i]; int j=0; for(; j < found.size(); j++) if(j != i && (r & found[j]) == r) break; if( j == found.size()) found_filtered.push_back(r); } //画矩形框,因为hog检测出的矩形框比实际人体框要稍微大些,所以这里需要做一些调整 for(int i=0; i<found_filtered.size(); i++) { Rect r = found_filtered[i]; r.x += cvRound(r.width*0.1); r.width = cvRound(r.width*0.8); r.y += cvRound(r.height*0.07); r.height = cvRound(r.height*0.8); rectangle(src, r.tl(), r.br(), Scalar(0,255,0), 3); } imwrite("d:/SVM/ImgProcessed3.jpg",src); namedWindow("src",0); imshow("src",src); waitKey();//注意:imshow之后必须加waitKey,否则无法显示图像 /******************读入单个64*128的测试图并对其HOG描述子进行分类*********************/ ////读取测试图片(64*128大小),并计算其HOG描述子 //Mat testImg = imread("person014142.jpg"); //Mat testImg = imread("noperson000026.jpg"); //vector<float> descriptor; //hog.compute(testImg,descriptor,Size(8,8));//计算HOG描述子,检测窗口移动步长(8,8) //Mat testFeatureMat = Mat::zeros(1,3780,CV_32FC1);//测试样本的特征向量矩阵 //将计算好的HOG描述子复制到testFeatureMat矩阵中 //for(int i=0; i<descriptor.size(); i++) // testFeatureMat.at<float>(0,i) = descriptor[i]; //用训练好的SVM分类器对测试图片的特征向量进行分类 //int result = svm.predict(testFeatureMat);//返回类标 //cout<<"分类结果:"<<result<<endl; system("pause"); } ```
用fputc写的lzw文件后半部分不能读取
参考代码写了一个lzw压缩程序,原先的txt文件4.8k,压缩后成为4.2k。可是无法还原,只能还原前面一部分。我用fgetc一个一个读出数据,发现到第291个数据就终止了,然后vs响15声。这是什么原因? 压缩输出的时候监测输出数据,291后面直到2000+个数据c都是正常的,被用fputc输出。复制粘贴到解压缩文件夹后就出问题了 解压缩的时候在第291个数据处开始读到EOF,之后所有的数据用fgetc读都是EOF。也就是说只有前面291个是正常数据,后面全写了-1进去,生成一个文件 附程序 //4.27添加修改0的模块,并避免溢出情形 #ifndef _COMPRESSDO_H #define _COMPRESSDO_H #endif #include <stdio.h> #include <math.h> #include <stdlib.h> #include <string.h> #include <io.h> #include<iostream> #include <sys\stat.h> #include<time.h> using namespace std; #define BOOL int #define MAX_CODES 4096 #define TRUE 1 #define FALSE 0 #define NOT_USED 0 #define HASH_SIZE 4096 #define VERBOSE 1 #define MAXSTRING 1000 const int BYTE_SIZE = 8; const int EXCESS = 4; const int ALPHA= 256; const int MASK = 15; int overnum=0; int bileftOver; int bitsLeftOver = 0; int flag; unsigned int get(unsigned int key,int flag); int fgetrealc(); unsigned int hash_code(unsigned int key,int flag); void compress(char *Filename); int compressdo(char *Filename); void init_hashtable(void); void output(unsigned int pcode,int flag); //void print_binary(int i); void put(unsigned int key, int flag,unsigned int b); void output_encode(unsigned int pcode,int flag); void set_file1(char *file); struct HASH_TABLE{ unsigned int key; int flag; }table[HASH_SIZE];//table是在定义结构体时声明的实例,是一个长为4099的数组 //i是码字,key是字符值,flag代表字符值中前面0的个数 FILE *in, *out; //file point of the source and destination int q[10];//因为是int,所以要判为>0才能输出 int l=-1; const int MASK1 = 255; const int MASK2 = 15; unsigned int get(unsigned int key,int flag){//判断key是否字符表中已有 unsigned int b = hash_code(key,flag); if(table[b].key == NOT_USED) return NOT_USED; return b;//两次返回实际上也是一次返回,并列两者只能二选其一并按顺序优先,满足if返回-1,不满足返回下一个 } unsigned int hash_code(unsigned int key,int flag){//转一圈寻找与key相同的值或者相应-1?并返回相应j;如果始终不满足,就只好返回i //也就是说,查找key是空字符还是已经定义的字符,并返回字符相应的编号;否则就再用一个新编号 unsigned int i = key%HASH_SIZE; unsigned int j; if(i<0) j=i+HASH_SIZE; else j = i; do{ if((table[j].key == key) & (table[j].flag==flag)) return j; else {if( table[j].key == NOT_USED ) return j;} j = (j+1)%HASH_SIZE; }while(j!=i); return j;//这个两重返回是什么意思?实际上是一次返回,当满足a[j]==5,大括号内j返回给外面的j,j再返回给主函数 //如果始终不满足,则只好返回i值 } void compress(){ int i, codeUsed, ccc,e; unsigned int pcode, k; init_hashtable(); for(i=0; i<ALPHA; i++) put(i,0,i); codeUsed = ALPHA; ccc = fgetrealc(); if(ccc!=EOF){ pcode = ccc; ccc = fgetrealc(); int j=0; while(ccc!=EOF){ //j++; //cout<<j<<endl; if(pcode>16777215 )//避免溢出 { output_encode(pcode,flag); j++; cout<<j<<endl; flag=0; pcode=ccc;} else{ if(pcode ==0) flag++; k = (pcode<<BYTE_SIZE)+ccc; e = get(k,flag); if(e==NOT_USED) //not in dictionary { if(codeUsed<MAX_CODES ) put( k,flag,codeUsed++); if(pcode==0) output_encode(pcode,flag-1); else {output_encode(pcode,flag); j++; cout<<j<<endl; } flag=0; pcode = ccc; } else pcode = k;//这里会溢出 } ccc=fgetrealc(); } output_encode(pcode,flag); j++; cout<<j<<endl; if(bitsLeftOver) fputc(bileftOver<<EXCESS, out); } fclose(in); fclose(out); } void init_hashtable(void){//初始化所有字符为未使用 int i; for(i=0; i<HASH_SIZE; i++) {table[i].key = NOT_USED; table[i].flag=0;} } int fgetrealc() { int c,code; int t=0; if(l<0) { c = fgetc(in); // cout<<ferror(in)<<endl; if(c == EOF) { for(int i=9;i>=0;i--){ q[i]=fgetc(in); if(q[i]==-1) t++; } if(t==10) return EOF; else l=9; } else { if(c<0) c+=256; return c; } } if(l>=0) { if(c<0) c+=256; code=c; c=q[l]; l--; return code; } } void output_encode(unsigned int pcode,int flag){ unsigned int a=0,d=0,p; p=get(pcode,flag);//这时才转换为12位 /*if(p==-1) {cout<<"p==-1"<<endl; system("pause");}*/ if(bitsLeftOver){ d = p & MASK1; a = (bileftOver << EXCESS)+(p>>BYTE_SIZE); //printf("%i - ", c);print_binary(c); //printf("%i - ", d);print_binary(d); fputc(a, out); // cout<<ferror(out)<<endl; fputc(d, out); // cout<<ferror(out)<<endl; bitsLeftOver =0; } else{ bileftOver = p & MASK2; a = p>>EXCESS; //printf("%i - ", c);print_binary(c); fputc(a, out); // cout<<ferror(out)<<endl; bitsLeftOver = 1; } } //for debug used void print_binary(int i){ int j; for(j=7; j>=0; j--) printf("%i", (i>>j)&1); printf("\n"); } void put(unsigned int key, int flag,unsigned int b){ // int b = hash_code(key,flag); if(table[b].key == NOT_USED){ table[b].key = key; table[b].flag = flag; return ; } else{ if((table[b].key == key) & (table[b].flag==flag)){ //duplicate //this should not happen printf("Internal error occur during hashing:duplicate"); exit(1); } else{ //table is full //this should not happen printf("Internal error occur during hashing:table full"); exit(1); } } } void set_files1(char *file){ in = fopen(file,"r"); out=fopen("testtxt.lzw","w"); } long get_file_size( char * filename ) { struct stat f_stat; if( stat( filename, &f_stat ) == -1 ){ return -1; } /*int stat(const char *path, struct stat *struct_stat); int lstat(const char *path,struct stat *struct_stat); 两个函数的第一个参数都是文件的路径,第二个参数是struct stat的指针 这样就获取了文件各种参数存在f_stat里面 返回其中的st_size*/ return (long)f_stat.st_size; } void printusage (void) { printf("Usage:lzw -flag source \n"); printf("flag should be encode or decode\n"); printf("When the flag is decode, the source file should be the format of \"*.lzw\" \n"); printf("Example: \"lzw -encode test.c\" ,then the output file would be test.c.lzw \n"); } /************ Main Function *****************************************************************/ int compressdo(char *Filename){ cout<<"encoding"<<endl; time_t tm1,tm2; double filesize1,filesize2,lzwrate; time(&tm1); // cout<<ctime(&tm1)<<endl; filesize1=get_file_size(Filename); cout<<"filesize1="<<filesize1<<endl; set_files1(Filename); compress(); time(&tm2); cout<<"timecost="<<difftime(tm2,tm1)<<endl; filesize2=get_file_size("testtxt.lzw"); cout<<"filesize2="<<filesize2<<endl; lzwrate=filesize1/filesize2; cout<<"lzwrate="<<lzwrate<<endl; system("pause"); return(0); } /*else if (temp_flag==1) { // decode printf ("Decoding %s ......\n", argv[2]); set_files_decode(outname); tm = time(NULL); printf(ctime(&tm)); decompress(); tm = time(NULL); printf(ctime(&tm)); filesize=get_file_size(inname); printf("%l",filesize); return(0); } printusage(); return(1); }*/
c语言数据结构词索引表出了点问题,谁能帮忙看看呀
#include<stdio.h> #include<string.h> #include<stdlib.h> #include <conio.h> #include <ctype.h> #define OK 1 #define ERROR 0 #define TRUE 1 #define FALSE 0 #define OVERFLOW -2 #define MaxBookNum 1000 //假设只对1000本书建立索引表(1000) #define MaxKeyNum 2500 //索引表的最大容量(2500) #define MaxLineLen 500 //书目串的最大长度(500) #define MaxWordNum 10 //词表的最大容量 #define MaxWordLength 30 //单词的最大长度 typedef int Status; typedef int ElemType; //定义链表的数据元素类型为整型 typedef int Boolean; typedef struct { char item[MaxWordNum][MaxWordLength]; //字符串的数组 int last; //词表的长度 }WordListType; //词表的类型(顺序表) typedef struct { char *ch; //如果是非空串,则按串长分配存储区,否则ch为NULL int length; //串长度 }HString; typedef struct LNode { ElemType data; struct LNode *next; }LNode,*Link,*Position; typedef struct { Link head,tail; int len; }LinkList; typedef struct { HString key; //关键词 LinkList bnolist; //存放书号索引的链表 }IdxTermType; //索引项类型 typedef struct { IdxTermType item[MaxKeyNum+1]; int last; }IdxListType; //索引表类型 //----------------主要变量-------------- char buf[MaxLineLen]; //书目串缓冲区 WordListType wdlist; //关键字词表 IdxListType idxlist; //索引表 char oftenwords[6][10] = {"an","a","of","and","to","the"}; /*******************************声明部分****************************************/ //--------------基本操作--------- void InitIdxList (IdxListType *idxlist); //初始化操作,置索引表idxlist为空表,且在idxlist.item[0]设一空串 void GetLine (FILE *f); //从文件F读入一个书目信息到书目串缓冲区buf void ExtractKeyWord (int *Num); //Status ExtractKeyWord(char* Buffer,WordListType *w,int *Num); //从buf中提取书名关键词到词表wdlist,书号存入bno Status InsIdxList (IdxListType *idxlist,ElemType bno); //将书号为bno的书名关键词按词典顺序插入索引表idxlist void PutText (FILE *g,IdxListType idxlist); //将生成的索引表idxlist输出到文件g //--------------为实现在索引表上进行插入,要先实现下列操作----------- void GetWord (int i,HString *wd); //用wd返回词表wdist中第i个关键词 int Locate (IdxListType *idxlist,HString wd,Boolean *b); //在索引表idxlist中查询是否存在与wd相等的关键词。若存在,则返回其在索引表 //中的位置,且b取值TRUE;否则返回插入位置,且b取值FALSE void InsertNewKey(int j,HString wd); //在索引表idxli的第i项上插入新关键词wd,并初始化书号索引的链表为空表 Status InsertBook (int i,int bno); //在索引表idxlist的第i项中插入书号为bno的索引 //------------串的堆分配存储表示----------- Status StrAssign(HString *T,char *chars); //生成一个其值等于串常量chars的串T int StrCompare(HString S,HString T); //若S>T,则返回值>0,若S=T,则返回值 = 0,若S<T,则返回值<0 Status StrCopy(HString *T, HString S); //由串S复制得串T //----------------带头结点的线性链表------------- Status InitList(LinkList *L); //构造一个空的线性链表L Status MakeNode(Link *p,ElemType e); //分配由p指向值e的结点,并返回OK;若分配失败,则返回ERROR Status Append (LinkList *L,Link s); //将指针s所指的一串结点链接在线性链表L的最后一个结点 //之后,改变链表L的尾指针指向新的尾结点 /*******************************函数部分****************************************/ Status StrAssign(HString *T,char *chars) { int i = strlen(chars); if((*T).ch) free((*T).ch); if(!i){ //若chars为空 (*T).ch = NULL; (*T).length = 0; } else{ //chars不空 if(!((*T).ch = (char *)malloc(i * sizeof(char)))) //为T分配chars所需的存储空间 exit(OVERFLOW); int count; for(count = 0;count <= i;count++) //把chars存入T中 (*T).ch[count] = chars[count]; (*T).length = i; } //else return OK; } void InitString(HString *T) { (*T).length = 0; (*T).ch = NULL; } int StrCompare(HString S,HString T) { int count; for(count = 0;count<S.length && count<T.length;count++){ if(S.ch[count] != T.ch[count]) return S.ch[count]-T.ch[count] ; } return S.length-T.length; } Status StrCopy(HString *T, HString S) { int j; if((*T).ch) free((*T).ch); //删除T串中原有值 (*T).ch = (char*)malloc(S.length * sizeof(char)); if(!(*T).ch) exit(OVERFLOW); for(j = 0; j <= S.length; j++) (*T).ch[j] = S.ch[j]; (*T).length = S.length; return OK; } Status InitList(LinkList *L) { Link p; p = (Link)malloc(sizeof(LNode)); if(!p) exit(OVERFLOW); p->next = NULL; (*L).head = (*L).tail = p; (*L).len = 0; return OK; } Status MakeNode(Link *p,ElemType e) { *p = (Link)malloc(sizeof(LNode)); if(!(*p)) exit(OVERFLOW); (*p)->data = e; (*p)->next = NULL; return OK; } Status Append (LinkList *L,Link s) { int i = 1; (*L).tail->next = s; while(s->next){ s = s->next; i++; } (*L).tail = s; (*L).len += i; return OK; } void GetWord(int i,HString *wd) { char *p; p = *(wdlist.item +i); StrAssign(wd,p); //生成关键字字符串 } int Locate(IdxListType *idxlist,HString wd,Boolean *b) { int i,m; for(i = (*idxlist).last-1; ( m=StrCompare((*idxlist).item[i].key,wd) ) >0; --i); if(m == 0){ //找到 *b = TRUE; return i; } else{ *b = FALSE; return i+1; } } void InsertNewKey(int j,HString wd) { int count; InitList(&idxlist.item[idxlist.last+1].bnolist); for(count = idxlist.last-1; count>=j; --count){ //后移索引项 idxlist.item[count+1] = idxlist.item[count]; } InitString(&idxlist.item[j].key); StrCopy(&idxlist.item[j].key,wd); //插入新的索引项 //串赋值 InitList(&idxlist.item[j].bnolist); //初始化书号索引表为空表 ++idxlist.last; } Status InsertBook (int i,int bookno) { Link p; if(!MakeNode(&p,bookno)) return ERROR; Append(&idxlist.item[i].bnolist,p); return OK; } Status InsertIdxList(IdxListType *idxlist,int bno) { int i,j; HString wd; Boolean b; InitString(&wd); for(i= 0;i<wdlist.last;++i){ GetWord(i,&wd); //获取wdlist中保存的单词 j = Locate(idxlist,wd,&b); //查找是否已存在于idxlist中 if(!b) //不存在 InsertNewKey(j,wd); //则插入新的关键词 InsertBook(j,bno); //插入书号 } return OK; } void InitIdxList (IdxListType *idxlist) { int i; (*idxlist).last = 0; for(i = 0;i<MaxKeyNum;i++){ InitList(&(*idxlist).item[i].bnolist); //初始化索引表项目中的书号的链表 } } void ExtractKeyWord (int *BookNum) { int i = 0,j = 0,k = 0,m; wdlist.last = 0; //很重要 Boolean Ignore; char TempChar[30]; for(m = 0;m<=30;m++) TempChar[m] = '\0'; //清空TempChat[] while(*(buf+i) !=' '){ //提取书目串缓冲区其中的书号 TempChar[i] = *(buf+i); //将书号以字符串类型保存在该数组中 i++; } TempChar[i] ='\0'; *BookNum = atoi(TempChar); //将书号转为int for(m = 0;m<=i;m++) TempChar[m] ='\0'; //清空TempChat[] i++; //推进一位,当前*(buf+i)开始为书名 while(*(buf+i) !='\n' && *(buf+i) != '\0'){ //每个字符串末尾都有结束符\n if(*(buf+i) != ' '){ //若非空字符 if(*(buf+i) >'A'&& *(buf+i) <= 'Z'){ *(buf+i) -= 'A' - 'a'; //若为大写,则转为小写 } TempChar[j] = *(buf+i); //把当前字符加入TempChar中//------------ j++; i++; } //if else{ //若为空字符,则检索当前TempChar中保存的字符串是否为常用词 Ignore = FALSE; //若Ignore为TRUE,则为常用词;为FALSE则不是常用词 for(m = 0;m<6;m++){ //查找是否为常用词 if(strcmp(TempChar,oftenwords[m]) == 0){ Ignore = TRUE; //是常用词 break; }//if }//for if(Ignore){ for(m = 0;m<=j;m++) TempChar[m] = '\0'; //清空TempChat[] i++; j = 0; }//if else{ //不是常用词 for(m = 0;m<=j;m++) //将该词插入wdlist中 wdlist.item[wdlist.last][m] = TempChar[m]; for(m = 0;m<=j;m++) TempChar[m] = '\0'; //清空TempChat[] k++; wdlist.last++; i++; j=0; }//else }//else }//while } void GetLine(FILE *f) { fgets(buf,MaxLineLen,f); } void PutText (FILE *g,IdxListType idxlist) { int i,j,k; Link p; for(i = 0;i<=idxlist.last;i++){ for(j = 0;j<idxlist.item[i].key.length; j++) putc(*(idxlist.item[i].key.ch + j),g); putc('\t',g); if(idxlist.item[i].key.length < 8) putc('\t',g); p = idxlist.item[i].bnolist.head; for(k = 0;k<idxlist.item[i].bnolist.len ; k++){ p = p->next; fprintf(g,"%03d",p->data); putc(' ',g); }//for putc('\n',g); }//for } void PrintFile(FILE *FileName) { char ch; rewind(FileName); ch = getc(FileName); while(ch != EOF){ putchar(ch); ch = getc(FileName); } printf("\n"); rewind(FileName); } /*******************************主函数部分**************************************/ int main() { FILE *f,*g; int ct; int BookNo; if((f = fopen("BookName.txt","r")) == NULL){ printf("ERROR in open BookName.txt\n"); exit(1); } if((g = fopen("KeyWordIndex_self.txt","w"))==NULL){ printf("ERROR in open KeyWordIndex_self.txt\n"); exit(1); } printf("书单文件:\n"); PrintFile(f); InitIdxList(&idxlist); WordListType w; while(!feof(f)){ GetLine(f); //读取书单文件中的一行到缓冲区 ExtractKeyWord(&BookNo); InsertIdxList(&idxlist,BookNo); } PutText(g,idxlist); fclose(f); fclose(g); printf("\n结果如下:\n"); if((g = fopen("KeyWordIndex_self.txt","r"))==NULL){ printf("ERROR in open KeyWorkIndex_self.txt\n"); exit(1); } PrintFile(g); fclose(g); return 0; }
新手 关于 c++链表问题
这个程序后面有时候会stu * p, 那new出来的空间不用delete回收掉吗? ``` #include <iostream> #include <iomanip> #include <fstream> #include <string> using namespace std; /* Written by 武汉大学国际软件学院—陈志杰 in 2016/12/5 对于这个程序的简要介绍: 1.内存中学生记录的形式为链表结构,链表结构便于增删,容量能自主控制 2.读取txt文本的学生信息会clear链表中的所有值(详见clear函数) 3.增删学生记录函数只会在内存中做操作,而不会自动保存到txt中,需要手动调用保存才会存放到硬盘的文件上 4.所有堆的创建释放应该注意完全了 @All rights reserved. */ string course_names[5] = { "高数","英语","计算机","体育","政治" }; //这个全局变量以便某些函数使用 class Course { public: char* name; int courseID; int credit; int time; }; class Score { public: double score; char* courseName; }; class Student { public: Score scores[5]; int stuID; string name; public: Student() { scores[0].courseName = "高数"; scores[1].courseName = "英语"; scores[2].courseName = "计算机"; scores[3].courseName = "体育"; scores[4].courseName = "政治"; } }; class stu { //这个类用来作为学生链表的节点类 public: Student* student; stu* next; //指向下一个节点 public: stu() { student = new Student(); next = nullptr; } ~stu() { delete student; } }; class controller { private: stu* start; //作为一条学生类的链表头来记录学生的信息 stu* temp; //当前指向的节点,用作游标 public: controller() { start = new stu(); delete start->student; start->student = nullptr; temp = start; } public: //添加学生 void addStudent() { //其中a,b,c,d,e分别是不同的课程成绩 string name; int id; double a, b, c, d, e; cout <<endl<< "请输入学生学号:" << endl; cin >> id; cout << endl << "请输入学生姓名:" << endl; cin >> name; cout << endl << "请输入高数成绩:" << endl; cin >> a; cout << endl << "请输入英语成绩:" << endl; cin >> b; cout << endl << "请输入计算机成绩:" << endl; cin >> c; cout << endl << "请输入体育成绩:" << endl; cin >> d; cout << endl << "请输入政治成绩:" << endl; cin >> e; temp->next = new stu(); temp = temp->next; temp->student->scores[0].score = a; temp->student->scores[1].score = b; temp->student->scores[2].score = c; temp->student->scores[3].score = d; temp->student->scores[4].score = e; temp->student->name = name; temp->student->stuID = id; system("cls"); cout << "添加成功!" << endl << endl << endl; } //显示某个学生信息 void display(int id) { system("cls"); cout << "学号/姓名/高数/英语/计算机/体育/政治" << endl; stu* p = start; while (p != nullptr) { if (p->student != nullptr) { if (p->student->stuID == id) { cout << p->student->stuID << "/" << p->student->name; for (int i = 0;i < 5;i++) { cout <<"/"<< p->student->scores[i].score; } cout << endl; } } p = p->next; } cout << endl << endl; } //显示所有学生的信息 void display() { system("cls"); cout << "学号/姓名/高数/英语/计算机/体育/政治" << endl; stu* p = start; while (p != nullptr) { if (p->student != nullptr) { cout << p->student->stuID << "/" << p->student->name; for (int i = 0;i < 5;i++) { cout << "/" << p->student->scores[i].score; } cout << endl; } p = p->next; } cout << endl << endl; } //按某门课程查询所有学生的成绩(i代表课程号,只为便于编程) void displayAllByCourse() { cout << "高数:0 英语:1 计算机:2 体育:3 政治:4 " << endl; cout << "请输入您要查询的课程编号:"; int i = 0; cin >> i; system("cls"); cout << "学号/姓名/" << course_names[i]<< endl; stu* p = start; while (p != nullptr) { if (p->student != nullptr) { cout << p->student->stuID << "/" << p->student->name; cout << "/" << p->student->scores[i].score; cout << endl; } p = p->next; } cout << endl << endl; } //按照某门课程的成绩来排序 void sortByCourse() { cout << "高数:0 英语:1 计算机:2 体育:3 政治:4 " << endl; cout << "请输入您要排序的课程编号:"; int i = 0; cin >> i; stu* p1 = start->next; stu* p2 = start->next; while (p1 != nullptr) { p2 = p1->next; while (p2 != nullptr) { if (p1->student != nullptr && p2->student != nullptr) { if (p1->student->scores[i].score <= p2->student->scores[i].score) { Student* st = p1->student; p1->student = p2->student; p2->student = st; } } p2 = p2->next; } p1 = p1->next; } system("cls"); cout << "排序成功!" << endl; cout << endl << endl; } //按照总分排序 void sortBySum() { stu* p1 = start->next; stu* p2 = start->next; while (p1 != nullptr) { p2 = p1->next; while (p2 != nullptr) { if (p1->student != nullptr && p2->student != nullptr) { double s1=0, s2=0; for (int i = 0; i < 5; i++) { s1 += p1->student->scores[i].score; s2 += p2->student->scores[i].score; } if (s1<s2) { Student* st = p1->student; p1->student = p2->student; p2->student = st; } } p2 = p2->next; } p1 = p1->next; } system("cls"); cout << "排序成功!" << endl; cout << endl << endl; } //将某门课不及格的学生显示出来 void displayStuNotPass() { cout << "高数:0 英语:1 计算机:2 体育:3 政治:4 " << endl; cout << "请输入您要选择的课程编号:"; int i = 0; cin >> i; system("cls"); cout << "学号/姓名/高数/英语/计算机/体育/政治" << endl; stu* p = start; while (p != nullptr) { if (p->student != nullptr && p->student->scores[i].score <60) { cout << p->student->stuID << "/" << p->student->name; for (int i = 0;i < 5;i++) { cout << "/" << p->student->scores[i].score; } cout << endl; } p = p->next; } cout << endl << endl; } //清除所有数据 void clear() { stu* p; while (start->next != nullptr) { p = start->next; start->next = p->next; delete p; } } //读取信息 void readStu() { ifstream in; in.open(".\\student.txt"); bool flag = false; char buf[255]; clear(); while (!in.eof()) { if (flag == true) { string name; int id; double a, b, c, d, e; in >> id >> name >> a >> b >>c >> d >> e; temp->next = new stu(); temp = temp->next; temp->student->scores[0].score = a; temp->student->scores[1].score = b; temp->student->scores[2].score = c; temp->student->scores[3].score = d; temp->student->scores[4].score = e; temp->student->name = name; temp->student->stuID = id; } else { in >> buf >> buf >> buf >> buf >> buf >> buf >> buf; flag = true; } } in.close(); system("cls"); cout << "信息读取成功!" << endl << endl << endl; } void deleteStu() { cout << "请输入你要删除的学生的id:" << endl; int id; cin >> id; stu* p1 = start; stu* p2 = p1->next; while (p2 != nullptr) { if (p2->student != nullptr) { if (p2->student->stuID == id) { p1->next = p2->next; delete p2; p2 = p1->next; } else { p1 = p1->next; p2 = p2->next; } } } system("cls"); cout << "删除操作完毕!" << endl << endl << endl; } //保存学生信息 void saveStu() { ofstream out(".\\student.txt"); out << setw(10) << "学号" << setw(10) << "姓名" << setw(10) << "高数" << setw(10) << "英语" << setw(10) << "计算机" << setw(10) << "体育" << setw(10) << "政治" << endl; stu* p = start; while (p != nullptr) { if (p->student != nullptr) { out <<setw(10)<< p->student->stuID << setw(10) << p->student->name; for (int i = 0;i < 5;i++) { out << setw(10) << p->student->scores[i].score; } if (p->next != nullptr) { out << endl; } } p = p->next; } out.flush(); out.close(); system("cls"); cout << "信息保存完毕!" << endl << endl << endl; } }; int main() { controller con; while (true) { cout << "******************主菜单******************" << endl; cout << "1.读取txt学生信息" << endl; cout << "2.插入学生信息" << endl; cout << "3.显示所有学生信息" << endl; cout << "4.按课程显示学生信息" << endl; cout << "5.显示所有某课程不及格的学生" << endl; cout << "6.按课程排序" << endl; cout << "7.按总分排序" << endl; cout << "8.删除学生信息" << endl; cout << "9.保存所有学生信息" << endl; cout << "10.退出系统" << endl; cout << "******************************************" << endl; int i = 0; cin >> i; switch (i) { case 1: con.readStu(); break; case 2: con.addStudent(); break; case 3: con.display(); break; case 4: con.displayAllByCourse(); break; case 5: con.displayStuNotPass(); break; case 6: con.sortByCourse(); break; case 7: con.sortBySum(); break; case 8: con.deleteStu(); break; case 9: con.saveStu(); break; case 10: exit(0); break; default: cout << "请输入1-8的某个数字进行选择!" << endl; break; } } } ```
爬虫福利二 之 妹子图网MM批量下载
爬虫福利一:27报网MM批量下载 点击 看了本文,相信大家对爬虫一定会产生强烈的兴趣,激励自己去学习爬虫,在这里提前祝:大家学有所成! 目标网站:妹子图网 环境:Python3.x 相关第三方模块:requests、beautifulsoup4 Re:各位在测试时只需要将代码里的变量path 指定为你当前系统要保存的路径,使用 python xxx.py 或IDE运行即可。 ...
Java学习的正确打开方式
在博主认为,对于入门级学习java的最佳学习方法莫过于视频+博客+书籍+总结,前三者博主将淋漓尽致地挥毫于这篇博客文章中,至于总结在于个人,实际上越到后面你会发现学习的最好方式就是阅读参考官方文档其次就是国内的书籍,博客次之,这又是一个层次了,这里暂时不提后面再谈。博主将为各位入门java保驾护航,各位只管冲鸭!!!上天是公平的,只要不辜负时间,时间自然不会辜负你。 何谓学习?博主所理解的学习,它是一个过程,是一个不断累积、不断沉淀、不断总结、善于传达自己的个人见解以及乐于分享的过程。
程序员必须掌握的核心算法有哪些?
由于我之前一直强调数据结构以及算法学习的重要性,所以就有一些读者经常问我,数据结构与算法应该要学习到哪个程度呢?,说实话,这个问题我不知道要怎么回答你,主要取决于你想学习到哪些程度,不过针对这个问题,我稍微总结一下我学过的算法知识点,以及我觉得值得学习的算法。这些算法与数据结构的学习大多数是零散的,并没有一本把他们全部覆盖的书籍。下面是我觉得值得学习的一些算法以及数据结构,当然,我也会整理一些看过...
Python——画一棵漂亮的樱花树(不同种樱花+玫瑰+圣诞树喔)
最近翻到一篇知乎,上面有不少用Python(大多是turtle库)绘制的树图,感觉很漂亮,我整理了一下,挑了一些我觉得不错的代码分享给大家(这些我都测试过,确实可以生成) one 樱花树 动态生成樱花 效果图(这个是动态的): 实现代码 import turtle as T import random import time # 画樱花的躯干(60,t) def Tree(branch, ...
大学四年自学走来,这些私藏的实用工具/学习网站我贡献出来了
大学四年,看课本是不可能一直看课本的了,对于学习,特别是自学,善于搜索网上的一些资源来辅助,还是非常有必要的,下面我就把这几年私藏的各种资源,网站贡献出来给你们。主要有:电子书搜索、实用工具、在线视频学习网站、非视频学习网站、软件下载、面试/求职必备网站。 注意:文中提到的所有资源,文末我都给你整理好了,你们只管拿去,如果觉得不错,转发、分享就是最大的支持了。 一、电子书搜索 对于大部分程序员...
计算机专业的书普遍都这么贵,你们都是怎么获取资源的?
介绍几个可以下载编程电子书籍的网站。 1.Github Github上编程书资源很多,你可以根据类型和语言去搜索。推荐几个热门的: free-programming-books-zh_CN:58K 星的GitHub,编程语言、WEB、函数、大数据、操作系统、在线课程、数据库相关书籍应有尽有,共有几百本。 Go语言高级编程:涵盖CGO,Go汇编语言,RPC实现,Protobuf插件实现,Web框架实...
小白学 Python 爬虫(25):爬取股票信息
人生苦短,我用 Python 前文传送门: 小白学 Python 爬虫(1):开篇 小白学 Python 爬虫(2):前置准备(一)基本类库的安装 小白学 Python 爬虫(3):前置准备(二)Linux基础入门 小白学 Python 爬虫(4):前置准备(三)Docker基础入门 小白学 Python 爬虫(5):前置准备(四)数据库基础 小白学 Python 爬虫(6):前置准备(...
卸载 x 雷某度!GitHub 标星 1.5w+,从此我只用这款全能高速下载工具!
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个喜欢在网上收集各种资源的蒟蒻… 网上资源眼花缭乱,下载的方式也同样千奇百怪,比如 BT 下载,磁力链接,网盘资源等等等等,下个资源可真不容易,不一样的方式要用不同的下载软件,因此某比较有名的 x 雷和某度网盘成了我经常使用的工具。 作为一个没有钱的穷鬼,某度网盘几十 kb 的下载速度让我...
《面试宝典》2019年springmvc面试高频题(java)
前言 2019即将过去,伴随我们即将迎来的又是新的一年,过完春节,马上又要迎来新的金三银四面试季。那么,作为程序猿的你,是否真的有所准备的呢,亦或是安于本职工作,继续做好手头上的事情。 当然,不论选择如何,假如你真的准备在之后的金三银四跳槽的话,那么作为一个Java工程师,就不可不看了。如何在几个月的时间里,快速的为即将到来的面试进行充分的准备呢? 1、什么是Spring MVC ?简单...
一名大专同学的四个问题
【前言】   收到一封来信,赶上各种事情拖了几日,利用今天要放下工作的时机,做个回复。   2020年到了,就以这一封信,作为开年标志吧。 【正文】   您好,我是一名现在有很多困惑的大二学生。有一些问题想要向您请教。   先说一下我的基本情况,高考失利,不想复读,来到广州一所大专读计算机应用技术专业。学校是偏艺术类的,计算机专业没有实验室更不用说工作室了。而且学校的学风也不好。但我很想在计算机领...
复习一周,京东+百度一面,不小心都拿了Offer
京东和百度一面都问了啥,面试官百般刁难,可惜我全会。
轻松搭建基于 SpringBoot + Vue 的 Web 商城应用
首先介绍下在本文出现的几个比较重要的概念: 函数计算(Function Compute): 函数计算是一个事件驱动的服务,通过函数计算,用户无需管理服务器等运行情况,只需编写代码并上传。函数计算准备计算资源,并以弹性伸缩的方式运行用户代码,而用户只需根据实际代码运行所消耗的资源进行付费。Fun: Fun 是一个用于支持 Serverless 应用部署的工具,能帮助您便捷地管理函数计算、API ...
Python+OpenCV实时图像处理
目录 1、导入库文件 2、设计GUI 3、调用摄像头 4、实时图像处理 4.1、阈值二值化 4.2、边缘检测 4.3、轮廓检测 4.4、高斯滤波 4.5、色彩转换 4.6、调节对比度 5、退出系统 初学OpenCV图像处理的小伙伴肯定对什么高斯函数、滤波处理、阈值二值化等特性非常头疼,这里给各位分享一个小项目,可通过摄像头实时动态查看各类图像处理的特点,也可对各位调参、测试...
2020年一线城市程序员工资大调查
人才需求 一线城市共发布岗位38115个,招聘120827人。 其中 beijing 22805 guangzhou 25081 shanghai 39614 shenzhen 33327 工资分布 2020年中国一线城市程序员的平均工资为16285元,工资中位数为14583元,其中95%的人的工资位于5000到20000元之间。 和往年数据比较: yea...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
害怕面试被问HashMap?这一篇就搞定了!
声明:本文以jdk1.8为主! 搞定HashMap 作为一个Java从业者,面试的时候肯定会被问到过HashMap,因为对于HashMap来说,可以说是Java集合中的精髓了,如果你觉得自己对它掌握的还不够好,我想今天这篇文章会非常适合你,至少,看了今天这篇文章,以后不怕面试被问HashMap了 其实在我学习HashMap的过程中,我个人觉得HashMap还是挺复杂的,如果真的想把它搞得明明白...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
(总结)阿里面试问了ArrayList,都问了啥?
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
2020年1月中国编程语言排行榜,python是2019增长最快编程语言
编程语言比例 排名 编程语言 最低工资 工资中位数 最低工资 最高工资 人头 人头百分比 1 rust 20713 17500 5042 46250 480 0.14% 2 typescript 18503 22500 6000 30000 1821 0.52% 3 lua 18150 17500 5250 35000 2956 0.84% 4 go 17989 16...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
工作十年的数据分析师被炒,没有方向,你根本躲不过中年危机
2020年刚刚开始,就意味着离职潮高峰的到来,我身边就有不少人拿着年终奖离职了,而最让我感到意外的,是一位工作十年的数据分析师也离职了,不同于别人的主动辞职,他是被公司炒掉的。 很多人都说数据分析是个好饭碗,工作不累薪资高、入门简单又好学。然而今年34的他,却真正尝到了中年危机的滋味,平时也有不少人都会私信问我: 数据分析师也有中年危机吗?跟程序员一样是吃青春饭的吗?该怎么保证自己不被公司淘汰...
作为一名大学生,如何在B站上快乐的学习?
B站是个宝,谁用谁知道???? 作为一名大学生,你必须掌握的一项能力就是自学能力,很多看起来很牛X的人,你可以了解下,人家私底下一定是花大量的时间自学的,你可能会说,我也想学习啊,可是嘞,该学习啥嘞,不怕告诉你,互联网时代,最不缺的就是学习资源,最宝贵的是啥? 你可能会说是时间,不,不是时间,而是你的注意力,懂了吧! 那么,你说学习资源多,我咋不知道,那今天我就告诉你一个你必须知道的学习的地方,人称...
那些年,我们信了课本里的那些鬼话
教材永远都是有错误的,从小学到大学,我们不断的学习了很多错误知识。 斑羚飞渡 在我们学习的很多小学课文里,有很多是错误文章,或者说是假课文。像《斑羚飞渡》: 随着镰刀头羊的那声吼叫,整个斑羚群迅速分成两拨,老年斑羚为一拨,年轻斑羚为一拨。 就在这时,我看见,从那拨老斑羚里走出一只公斑羚来。公斑羚朝那拨年轻斑羚示意性地咩了一声,一只半大的斑羚应声走了出来。一老一少走到伤心崖,后退了几步,突...
一个程序在计算机中是如何运行的?超级干货!!!
强烈声明:本文很干,请自备茶水!???? 开门见山,咱不说废话! 你有没有想过,你写的程序,是如何在计算机中运行的吗?比如我们搞Java的,肯定写过这段代码 public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } ...
【蘑菇街技术部年会】程序员与女神共舞,鼻血再次没止住。(文末内推)
蘑菇街技术部的年会,别开生面,一样全是美女。
那个在阿里养猪的工程师,5年了……
简介: 在阿里,走过1825天,没有趴下,依旧斗志满满,被称为“五年陈”。他们会被授予一枚戒指,过程就叫做“授戒仪式”。今天,咱们听听阿里的那些“五年陈”们的故事。 下一个五年,猪圈见! 我就是那个在养猪场里敲代码的工程师,一年多前我和20位工程师去了四川的猪场,出发前总架构师慷慨激昂的说:同学们,中国的养猪产业将因为我们而改变。但到了猪场,发现根本不是那么回事:要个WIFI,没有;...
为什么程序猿都不愿意去外包?
分享外包的组织架构,盈利模式,亲身经历,以及根据一些外包朋友的反馈,写了这篇文章 ,希望对正在找工作的老铁有所帮助
Java校招入职华为,半年后我跑路了
何来 我,一个双非本科弟弟,有幸在 19 届的秋招中得到前东家华为(以下简称 hw)的赏识,当时秋招签订就业协议,说是入了某 java bg,之后一系列组织架构调整原因等等让人无法理解的神操作,最终毕业前夕,被通知调往其他 bg 做嵌入式开发(纯 C 语言)。 由于已至于校招末尾,之前拿到的其他 offer 又无法再收回,一时感到无力回天,只得默默接受。 毕业后,直接入职开始了嵌入式苦旅,由于从未...
世界上有哪些代码量很少,但很牛逼很经典的算法或项目案例?
点击上方蓝字设为星标下面开始今天的学习~今天分享四个代码量很少,但很牛逼很经典的算法或项目案例。1、no code 项目地址:https://github.com/kelseyhight...
Python全栈 Linux基础之3.Linux常用命令
Linux对文件(包括目录)有很多常用命令,可以加快开发效率:ls是列出当前目录下的文件列表,选项有-a、-l、-h,还可以使用通配符;c功能是跳转目录,可以使用相对路径和绝对路径;mkdir命令创建一个新的目录,有-p选项,rm删除文件或目录,有-f、-r选项;cp用于复制文件,有-i、-r选项,tree命令可以将目录结构显示出来(树状显示),有-d选项,mv用来移动文件/目录,有-i选项;cat查看文件内容,more分屏显示文件内容,grep搜索内容;>、>>将执行结果重定向到一个文件;|用于管道输出。
立即提问