33,311
社区成员
发帖
与我相关
我的任务
分享
// 功能:输出一个文件的最后n行数据,如果文件总行数不足n行,则显示全部数据
// 基本思路:把文件读入缓存,然后查找倒数第10个换行符
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// 反查找Buf缓冲区中字符ch, 次数num次, 如果找不到返回NULL,少于num,返回Buf
const char* rfindBuf_chrTimes(char* Buf, size_t BufSize , int ch, size_t num);
int main(int argc, char* argv[])
{
const char* fileName = "main.cpp"; //argv[1];
FILE* pFile = fopen(fileName, "r");
if (pFile == NULL) {
perror("打开文件时错误!");
return -1;
}
// 获得文件大小
fseek(pFile, 0, SEEK_END);
long fileSize = ftell(pFile);
fseek(pFile, 0, SEEK_SET);
// 把文件读到缓冲区
char* fileBuf = new char[fileSize + 1];
memset(fileBuf,0, fileSize + 1);
fread(fileBuf, fileSize, 1, pFile);
const char* ps = NULL;
// 查找函数
ps = rfindBuf_chrTimes(fileBuf, fileSize , '\n', 10);
// 测试代码
printf("%s:文件大小%ld\n", fileName,fileSize);
printf("%s\n", ps);
delete[] fileBuf;
fclose(pFile);
return 0;
}
// 反查找Buf缓冲区中字符ch, 次数num次, 如果找不到返回NULL,少于num,返回Buf
const char* rfindBuf_chrTimes(char* Buf, size_t BufSize , int ch, size_t num)
{
const char* ret = Buf;
const char* ps = Buf + BufSize;
size_t cnt = 0;
while (ps > Buf) {
if (*ps == ch)
cnt++;
if (cnt == num)
return (ret = ++ps);
ps--;
}
if (cnt == 0)
return NULL;
return ret;
} // IDE会在CPP代码最后添加一个空行,所以下面的空行也计算在内了
/*
功能:输出一个文件的最后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;
}
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
int main()
{
cout << "请输入文件名:";
string fileName;
cin >> fileName;
ifstream inFile(fileName); // 将要读的文件和文件输入流绑定
if (!inFile)
{
cerr << "file not exist" << endl;
return -1;
}
string strLine;
vector<string> v;
while (getline(inFile, strLine))
{
v.push_back(strLine);
}
if (v.size() < 10)
{
for (vector<string>::size_type i = 0; i != v.size(); ++i)
{
cout << v[i] << endl;
}
}
else
{
for (vector<string>::size_type i = v.size() - 10; i != v.size(); ++i)
{
cout << v[i] << endl;
}
}
return 0;
}
#include <iostream>
#include <fstream>
#include <string>
#include <vector>
using namespace std;
int main()
{
ifstream inFile("C:/kof.txt"); // 将要读的文件和文件输入流绑定
if (!inFile)
{
cerr << "file not exist" << endl;
return -1;
}
string strLine;
vector<string> v;
while (getline(inFile, strLine))
{
v.push_back(strLine);
}
if (v.size() < 10)
{
for (vector<string>::size_type i = 0; i != v.size(); ++i)
{
cout << v[i] << endl;
}
}
else
{
for (vector<string>::size_type i = v.size() - 10; i != v.size(); ++i)
{
cout << v[i] << endl;
}
}
return 0;
}