输出一个文件的最后n行数据,如果文件总行数不足n行,则显示全部数据

C程序,功能如题,代码如下:

/*
功能:输出一个文件的最后n行数据,如果文件总行数不足n行,则显示全部数据
基本思路:产生一个长度为n的二维数组,将它作为一个循环队列来看待
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUFLEN 256
// 显示一个文件的最后len行数据
void run(char *filename, int len)
{
int i;
char **buf = NULL;
char temp[BUFLEN] = {0};
FILE *fp;
buf = malloc(len * sizeof(char*));
for(i = 0; i < len; i++)
{
buf[i] = (char*)malloc(BUFLEN * sizeof(char));
memset(buf[i], 0, BUFLEN * sizeof(char));	// 清零
}
if((fp = fopen(filename, "r")) == NULL)
{
printf("open file [%s] failed\n", filename);
}
else
{
i = 0;
int lineCount = 0;			// 文件的实际行数
while(fgets(temp, BUFLEN, fp) != NULL)
{
strcpy(buf[i], temp);
i = (i + 1) % len; 
lineCount++;			// 数据行数加1
}
printf("lineCount = %d\n", lineCount);
if(lineCount <= len)		// 文件实际行数小于等于需要提取的行数
{
for(i = 0; i < lineCount; i++)
printf("L%d: %s", i+1, buf[i]);
}
else
{
int start = i;
do 
{
printf("L%d: %s", i, buf[i]);
i = (i + 1 + len) % len;
} while (i != start);
}
}
fclose(fp);
for(i = 0; i < len; i++)
free(buf[i]);
free(buf);
}
int main(int argc, char *argv[])
{
if(argc < 3)
{
printf("Usage: %s <filename> <n>\n", argv[0]);
}
else
{
int n = atoi(argv[2]);
run(argv[1], n);
printf("\n");
}
return 0;
}


运行结果:

[zcm@t #93]$./a test2.txt 2
lineCount = 4
L0:      3	chinese Chinese environment
L1:      4	english English environment
[zcm@t #94]$./a test2.txt 5
lineCount = 4
L1:      1	come one, obay
L2:      2	<Quidway> language-mode ?
L3:      3	chinese Chinese environment
L4:      4	english English environment
[zcm@t #95]$./a test2.txt 4
lineCount = 4
L1:      1	come one, obay
L2:      2	<Quidway> language-mode ?
L3:      3	chinese Chinese environment
L4:      4	english English environment
[zcm@t #96]$./a test2.txt 3
lineCount = 4
L1:      2	<Quidway> language-mode ?
L2:      3	chinese Chinese environment
L0:      4	english English environment
[zcm@t #97]$


 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/407282.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

javascript学习系列(13):数组中的concat方法

最好的种树是十年前,其次是现在。歌谣 每天一个前端小知识 提醒你改好好学习了 知乎博主 csdn博主 b站博主 放弃很容易但是坚持一定很酷 我是歌谣 喜欢就一键三连咯 你得点赞是对歌谣最大的鼓励 1前言 在我们的日常开发中 不免会有很多需要处理数据的方法 本节主要说一说c…

如何阻止表单的默认提交事件

表单一点击提交按钮(submit)必然跳转页面&#xff0c;如果表单的action为空也会跳转到自己的页面&#xff0c;即效果为刷新当前页。 如下&#xff0c;可以看到一点击提交按钮&#xff0c;浏览器的刷新按钮闪了一下&#xff1a; 如果想要阻止表单的默认提交事件&#xff0c;有以…

c#winform使用WebBrowser 大全[超长文转载]

1、主要用途&#xff1a;使用户可以在窗体中导航网页。 2、注意&#xff1a;WebBrowser 控件会占用大量资源。使用完该控件后一定要调用 Dispose 方法&#xff0c;以便确保及时释放所有资源。必须在附加事件的同一线程上调用 Dispose 方法&#xff0c;该线程应始终是消息或用户…

nessuss中文使用手册

Nessus使用手册&#xff0c;主要介绍了在各系统下的安装方式&#xff0c;以及怎么使用。转载于:https://blog.51cto.com/infosec/95054

exit(),_exit()的区别

Linux的源码 #define __NR_exit 1 #define __NR__exit __NR_exit /* 摘自文件include/asm-i386/unistd.h*/ "__NR_"是在Linux的源码中为每个系统调用加上的前缀&#xff0c;请注意第一个exit前有2条下划线&#xff0c;第二个exit前只有1条下划线…

javascript学习系列(15):数组中的lastIndexOf方法

最好的种树是十年前,其次是现在。歌谣 每天一个前端小知识 提醒你改好好学习了 知乎博主 csdn博主 b站博主 放弃很容易但是坚持一定很酷 我是歌谣 喜欢就一键三连咯 你得点赞是对歌谣最大的鼓励 1前言 在我们的日常开发中 不免会有很多需要处理数据的方法 本节主要说一说…

iOS新版微信底部返回横条问题

之前没有怎么接触过微信开发&#xff0c;只是对H5比较熟。最近维护一个微信公众号的项目&#xff0c;遇到了iOS端返回键的坑。 描述一下&#xff1a; 从公众号打开页面后&#xff0c;底部有个返回的小横条&#xff0c;恰好也挡住了页面。这不行啊&#xff0c;得解决。 页面的高…

【ExtJS】FormPanel 布局(一)

准备工作&#xff0c;布置一个最简单的Form&#xff0c;共5个组件&#xff0c;都为textfield。 1 Ext.onReady(function(){2 Ext.create(Ext.form.Panel, {3 width: 500,4 title: Layout,5      renderTo : form,6 items: [{7 xt…

squid代理架构

代理服务器是使用非常普遍的一种将局域网主机联入互联网的一种方式&#xff0c;使用代理上网可以节约紧缺的IP地址资源&#xff0c;而且可以阻断外部主机对内部主机的访问&#xff0c;使内部网主机免受外部网主机的***。但是&#xff0c;如果想让互联网上的主机访问内部网的主机…

JS之四舍五入Fixed

用法&#xff1a;toFixed() 方法可把 Number 四舍五入为指定小数位数的数字 语法&#xff1a;NumberObject.toFixed(num) 参数&#xff1a;必需。规定小数的位数&#xff0c;是 0 ~ 20 之间的值&#xff0c;包括 0 和 20&#xff0c;有些实现可以支持更大的数值范围。如果省略…

输出上下对称的星型

输出星型&#xff0c;如&#xff1a; ******************************* C code: // 用法如&#xff1a;a.exe 7#include<stdio.h>int main(int argc, char *argv[]){if(argc < 2){printf("Usage: %s <n>\n", argv[0]);}else{int n atoi(argv[1]);i…

javascript学习系列(16):数组中的every方法

最好的种树是十年前,其次是现在。歌谣 每天一个前端小知识 提醒你改好好学习了 知乎博主 csdn博主 b站博主 放弃很容易但是坚持一定很酷 我是歌谣 喜欢就一键三连咯 你得点赞是对歌谣最大的鼓励 1前言 在我们的日常开发中 不免会有很多需要处理数据的方法 本节主要说一说…

JS之Number的toString方法

作用&#xff1a;toString() 方法可把一个 Number 对象转换为一个字符串&#xff0c;并返回结果 语法&#xff1a;NumberObject.toString(radix) 参数&#xff1a;可选。规定表示数字的基数&#xff0c;使 2 ~ 36 之间的整数。若省略该参数&#xff0c;则使用基数 10。但是要…

signal函数说明

c traps and pitfalls 对signal函数解释得非常详细。 <signal.h> 中 void ( *signal( int sig, void (* handler)( int ))) ( int ); int (*p)(); 这是一个函数指针, p所指向的函数是一个不带任何参数, 并且返回值为int的一个函数. int (*fun())(); 这个式子与上面式子…

javascript学习系列(17):数组中的find方法

最好的种树是十年前,其次是现在。歌谣 每天一个前端小知识 提醒你改好好学习了 知乎博主 csdn博主 b站博主 放弃很容易但是坚持一定很酷 我是歌谣 喜欢就一键三连咯 你得点赞是对歌谣最大的鼓励 1前言 在我们的日常开发中 不免会有很多需要处理数据的方法 本节主要说一说…

RSA客户端js加密服务器C#解密(含源码)

本来用https感觉已经差不多了&#xff0c;客户非得要用户登录的时候再加密一次&#xff0c; 因为时间关系&#xff0c;原计划用C做客户端Activex加密暂被取消&#xff0c;花了两天时间在网上到处找&#xff0c;先作出了一个js的客户端加密先用着 思路 1.服务器每次随机生成公私…

vue mint-ui 弹出框

function toast(title){ //提示vm.$toast({message: title,position: middle,duration: 3000}); }效果如下 function toastSuccess(title){ //成功提示vm.$toast({message: title,iconClass: icon icon-success // (图标需自行准备&#xff09;}); } 效果如下 function lo…

REDIS 字典数据结构

对于REDIS来讲 其实就是一个字典结构&#xff0c;key ---->value 就是一个典型的字典结构 【当然 对于vaule来讲的话&#xff0c;有不同的内存组织结构 这是后话】 试想一个这样的存储场景&#xff1a; key:"city" value:"beijing" 如果有若干个这样…

JS之返回指定位置字符的charAt方法

作用&#xff1a;charAt() 方法可返回指定位置的字符&#xff0c;返回的字符是长度为 1 的字符串 语法&#xff1a;stringObject.charAt(index) 参数&#xff1a;必需。表示字符串中某个位置的数字&#xff0c;即字符在字符串中的下标 注意&#xff1a;字符串中第一个字符的…

OOB套接字传输实例(达不到预期结果)

参考资料&#xff1a;<<Linux网络编程.pdf>>page119-205 代码本来是全照书上抄的&#xff0c;后来发现编译不成功&#xff0c;所以就稍微改了下。下面是我修改后的代码&#xff1a; server.c // OOB套接字传输服务端(Server.c)#include <stdio.h>#include…