【C++怎么读文件啊】

WYD2608 2011-11-07 09:44:02
输入文件名在屏幕上显示文件后十行,若文件少于十行则全部输出

求 对C++不熟
...全文
300 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
hongwenjun 2012-02-10
  • 打赏
  • 举报
回复
//    功能:输出一个文件的最后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代码最后添加一个空行,所以下面的空行也计算在内了
hongwenjun 2012-02-10
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 newsimic 的回复:]

哇,纯C代码写出来的果然复杂些
[/Quote]

其实 C 也可以写的很短的
程序员小迷 2012-02-09
  • 打赏
  • 举报
回复
读取文件,依次读取换行符的位置,记录到一个动态内存中;
找到你需要的后10行的位置,统一读到另一块分配的动态内存中,
这样效率要高
NewSimic 2011-11-08
  • 打赏
  • 举报
回复
哇,纯C代码写出来的果然复杂些
JoeBlackzqq 2011-11-08
  • 打赏
  • 举报
回复

/*
功能:输出一个文件的最后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;
}


C程序,也可以改为cpp,运行结果:
[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]$
xiaobukuai 2011-11-08
  • 打赏
  • 举报
回复
晕,这代码发的。。。

再来
#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;
}
xiaobukuai 2011-11-08
  • 打赏
  • 举报
回复
稍微修改一下,加入手动输入文件名。例如,输入C:\kof.txt作为文件名,即可得到结果

[code=C/C++]#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;
}[\Code]
無_1024 2011-11-08
  • 打赏
  • 举报
回复
赞同LS的写法了
xiaobukuai 2011-11-08
  • 打赏
  • 举报
回复
将文件名和文件流绑定,然后再操作

#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;
}

33,311

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 新手乐园
社区管理员
  • 新手乐园社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧