怎样用fread与fseek从后向前读字符串!

bazzi2011 2012-04-24 10:50:27
比如一个.txt文件,内容是“中国万岁”。

现在想要倒序输出字符串的内容,也就是说先输出‘岁’,再输出‘万’,再输出‘国’,最后输出‘中’。

用fread和fseek该怎样做呢?

FILE *pFile = fopen(_T("1.txt"), _T("r"));
char ch[100];
memset(ch, 0, 100);
fseek(pFile, -2, SEEK_END); //这里的第二个参数该如何控制?
fread(ch, 1, 100, pFile); //这里的最后一个参数又该怎样控制?
MessageBox(ch);
fclose(pFile);
...全文
702 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2012-04-25
  • 打赏
  • 举报
回复
#include <stdio.h>
FILE *fi,*fo;
void main() {
fo=fopen("500M.out","wb");
fi=fopen("500M.in","rb");
fseek(fi,-1L,SEEK_END);
while (1) {
fputc(fgetc(fi),fo);
if (fseek(fi,-2,SEEK_CUR)) break;
}
fclose(fi);
fclose(fo);
}
evencoming 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]
引用 4 楼 的回复:
引用 3 楼 的回复:
引用 1 楼 的回复:
中文字符占两个字节的,比如你说的“中国万岁”存到字符串str中算上'\0'应该占9个字节,str[0]和str[1]表示“中”字!理解这个之后:
你把文件里所有数据都取出(取出多少个字节你自己当然清楚),想要倒序输出不就很简单了吗?就拿刚才的例子 str[6]+str[7]=“岁”,str[4]+str[5]="万"。……
[/Quote]

fseek(pFile, -buf_len, SEEK_END);
fread(ch, 1, 100, pFile); //如果想再读一次不同的数据的话,是不是要再加一个fssek

==>
//如果想再读一次不同的数据的话
fseek(pFile, -buf_len*2, SEEK_END);
fread(ch, 1, 100, pFile);
golden628 2012-04-25
  • 打赏
  • 举报
回复
你还不如一次性正序读到内存,然后倒序打印出来
赵4老师 2012-04-25
  • 打赏
  • 举报
回复
不要把
fopen("...","...");fscanf,fprintf,fclose //读时把\r\n替换成\n,写时把\n替换成\r\n;读到\x1a就设置EOF;读写的内容当字符看待

fopen("...","...b");fread,fwrite,fclose //不作以上替换,遇到\x1a仍继续读;读写的内容当字节看待
弄混了
赵4老师 2012-04-25
  • 打赏
  • 举报
回复
//GBK汉字内码范围(不包括A1xx~A9xx的标点符号英文字母特殊符号等)
//区码 ,位码
//81-A0 ,40-7E 80-FE
//AA-AF ,40-7E 80-A0
//B0-D6 ,40-7E 80-FE
//D7 ,40-7E 80-F9
//D8-F7 ,40-7E 80-FE
//F8-FE ,40-7E 80-A0
bazzi2011 2012-04-25
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]
引用 3 楼 的回复:
引用 1 楼 的回复:
中文字符占两个字节的,比如你说的“中国万岁”存到字符串str中算上'\0'应该占9个字节,str[0]和str[1]表示“中”字!理解这个之后:
你把文件里所有数据都取出(取出多少个字节你自己当然清楚),想要倒序输出不就很简单了吗?就拿刚才的例子 str[6]+str[7]=“岁”,str[4]+str[5]="万"。。。。。。。


实……
[/Quote]

如果要一次读两次数据,也就是用两次fread,是不是也要同时用两次fseek ???


fseek(pFile, -buf_len, SEEK_END);
fread(ch, 1, 100, pFile);

fseek(pFile, -buf_len, SEEK_END);
fread(ch, 1, 100, pFile); //如果想再读一次不同的数据的话,是不是要再加一个fssek



evencoming 2012-04-24
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]
引用 1 楼 的回复:
中文字符占两个字节的,比如你说的“中国万岁”存到字符串str中算上'\0'应该占9个字节,str[0]和str[1]表示“中”字!理解这个之后:
你把文件里所有数据都取出(取出多少个字节你自己当然清楚),想要倒序输出不就很简单了吗?就拿刚才的例子 str[6]+str[7]=“岁”,str[4]+str[5]="万"。。。。。。。


实际上我并不是要编写读txt……
[/Quote]
FILE *pFile = fopen(_T("1.txt"), _T("r"));
char ch[100+1];
memset(ch, 0, 100+1);
long buf_len=sizeof(ch)-1;
fseek(pFile, -buf_len, SEEK_END); //直接缓冲区长度. 如果要多次读取,改为-i*buf_len;
// i是 第i次读取.从0开始计数
fread(ch, 1, 100, pFile); //这里永远是文件指针,不用改.但是要注意fread的返回值.
ch[buf_len]='\0';
MessageBox(ch); //为了当做字符串输出,得多一个字符放'\0'.
fclose(pFile);


bazzi2011 2012-04-24
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]
中文字符占两个字节的,比如你说的“中国万岁”存到字符串str中算上'\0'应该占9个字节,str[0]和str[1]表示“中”字!理解这个之后:
你把文件里所有数据都取出(取出多少个字节你自己当然清楚),想要倒序输出不就很简单了吗?就拿刚才的例子 str[6]+str[7]=“岁”,str[4]+str[5]="万"。。。。。。。
[/Quote]

实际上我并不是要编写读txt的程序,只是举个读txt的例子比较简单而已。

我读的是视频流文件,不能够把它们全取出来再倒序,只能够读一点儿显示一点儿...

所以不必纠缠于怎样读字符串,我要的是一种方法,通用于读任何类型的文件,可以从后向前读固定的量,直至读完。
evencoming 2012-04-24
  • 打赏
  • 举报
回复
不要这样.
全部读入内存之后,再从后往前 输出或者倒序.

如果可能,转换成unicode编码再进行处理
TopsLuo 2012-04-24
  • 打赏
  • 举报
回复
中文字符占两个字节的,比如你说的“中国万岁”存到字符串str中算上'\0'应该占9个字节,str[0]和str[1]表示“中”字!理解这个之后:
你把文件里所有数据都取出(取出多少个字节你自己当然清楚),想要倒序输出不就很简单了吗?就拿刚才的例子 str[6]+str[7]=“岁”,str[4]+str[5]="万"。。。。。。。

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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