C/C++如何真正读取一行?

Binresist 2015-07-20 09:40:30
如题,在项目中遇到一个问题,需要把项目文件中的复合某种条件的语句全部读取出来,写入文件。
可是,实际行动的过程中,发现一个问题,那就是文件中有很多事.c文件,里面会有很多的诸如\0,\n等这样的东西,那c++得getline是不是就没办法用?
很纠结,因为要读取出来判断是否符合条件,所以肯定是要读到某个缓冲区中的,请教诸位大神,是否有办法?
...全文
277 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
Binresist 2015-07-21
  • 打赏
  • 举报
回复
感谢大家的回复,是我想当然了,试了一下果然是我想多了。文件正常读取,没有错误结束的地方,感谢!
赵4老师 2015-07-20
  • 打赏
  • 举报
回复
仅供参考:
#include <stdio.h>
#include <string.h>
#define MAXLEN 1000
char ln[MAXLEN];
FILE *f;
int i,z;
int b,n,L;
int main(int argc,char **argv) {
    if (argc<2) {
        printf("Usage:%s fullpathfilename.ext\nget total blank/non-blank/total linenumbers.\n",argv[0]);
        return 1;
    }
    f=fopen(argv[1],"r");
    if (NULL==f) {
        printf("Can not open file [%s]!\n",argv[1]);
        return 2;
    }
    z=0;
    b=0;
    n=0;
    L=0;
    while (1) {
        if (NULL==fgets(ln,MAXLEN,f)) break;
        L=strlen(ln);
        if ('\n'==ln[L-1]) {
            if (0==z) {
                for (i=0;i<L-1;i++) {
                    if (!(' '==ln[i] || '\t'==ln[i])) break;
                }
                if (i<L-1) z=1;//当前行不是空行
            }
            if (0==z) b++; else n++;
            z=0;
        } else {
            if (0==z) {
                for (i=0;i<L;i++) {
                    if (!(' '==ln[i] || '\t'==ln[i])) break;
                }
                if (i<L) z=1;//当前行不是空行
            }
        }
    }
    fclose(f);
    if (L>0 && '\n'!=ln[L-1]) {
        if (0==z) b++; else n++;//最后一行末尾无'\n'也计算
    }
    printf("File:[%s] total blank/non-blank/total linenumbers is %d/%d/%d\n",argv[1],b,n,b+n);
    return 0;
}
brookmill 2015-07-20
  • 打赏
  • 举报
回复
就用getline,没问题。源代码文件里面写的\0\n都是文本,不是真的换行。自己写几行代码,找个小文件试一下就知道了
cobra_chen 2015-07-20
  • 打赏
  • 举报
回复

void ProcessReadData(char* buf, int len)
{
	// 处理读出来的数据
}

bool ReadBinFile(const char* name)
{
	const int PIECE_SIZE = 16*1024;
	char buff[PIECE_SIZE];
	FILE* fp = fopen(name, "rb");
	if (!fp) return false;

	int readed = 0;
	while (true)
	{
		readed = fread(buff, 1, PIECE_SIZE, fp);
		if (0 >= readed) break;

		ProcessReadData(buff, readed);
	}

	fclose(fp);
}
cobra_chen 2015-07-20
  • 打赏
  • 举报
回复
那就按块读数据。然后进行处理。
Ainuokema 2015-07-20
  • 打赏
  • 举报
回复
\n\0人家直接不认好不,不信你可以试试

65,186

社区成员

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

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