【求助】关于读文件

bluestar2009 2018-03-16 10:21:13
用fgetc(fp); 可以直接从文件指针逐个读取

如何不用变量 从文件指针直接读取一行呢

因为读取一行非得指定一个字符串

有时候这个长度真的无法确定怎么读?

只能凭想象设置一个足够大的字符串数组来接收吗?
char str[256]={0};
fgets(str,sizeof(str),fp);

只能这样吗?
...全文
610 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2018-03-19
  • 打赏
  • 举报
回复
Talk is cheap, show me the code!
自信男孩 2018-03-17
  • 打赏
  • 举报
回复
说多了没有意义,只是纸上谈兵,最好自己写一写,把可能的情况都考虑进去,如何分次读取,如何查找。
赵4老师 2018-03-17
  • 打赏
  • 举报
回复
讨论千贴,不如调通一段zhao4zhong1贴的代码!
自信男孩 2018-03-17
  • 打赏
  • 举报
回复
引用 8 楼 bluestar2009 的回复:
[quote=引用 7 楼 cfjtaishan 的回复:] 。
遇到需要判断某一行是否包含某个字符串的 必须要一次性把一行读全了 有什么办法吗? 除了把str设置的超级大以外?C语言[/quote] 既然不知道一行有多少个字符,那么为啥不把多次读到的放到一个大的缓存里,然后在查找。或者每次读到之后就查找一下,然后根据被查字符的长度,讲第一次的末尾一定的长度放到下一次读取的缓存里,这样,即使两次读取,也能在第二次的读取中(第二次读取的缓存里有部分第一次末尾的数据)
赵4老师 2018-03-16
  • 打赏
  • 举报
回复
仅供参考:
#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;
}
ESMGAL 2018-03-16
  • 打赏
  • 举报
回复
getline
bluestar2009 2018-03-16
  • 打赏
  • 举报
回复
引用 1 楼 cfjtaishan 的回复:
如果不确定一行的长度,为啥不用fgetc呢?用fgetc做一下判断,判断是否读到一行的末尾。
想逐行读···
自信男孩 2018-03-16
  • 打赏
  • 举报
回复
如果不确定一行的长度,为啥不用fgetc呢?用fgetc做一下判断,判断是否读到一行的末尾。
bluestar2009 2018-03-16
  • 打赏
  • 举报
回复
分成两段有可能就刚好截成两段了
bluestar2009 2018-03-16
  • 打赏
  • 举报
回复
引用 7 楼 cfjtaishan 的回复:
遇到需要判断某一行是否包含某个字符串的 必须要一次性把一行读全了 有什么办法吗? 除了把str设置的超级大以外?C语言
自信男孩 2018-03-16
  • 打赏
  • 举报
回复
引用 6 楼 bluestar2009 的回复:
[quote=引用 5 楼 cfjtaishan 的回复:] [quote=引用 2 楼 bluestar2009 的回复:] [quote=引用 1 楼 cfjtaishan 的回复:] 如果不确定一行的长度,为啥不用fgetc呢?用fgetc做一下判断,判断是否读到一行的末尾。
想逐行读···[/quote] 那用fgets吧,fgets有一个特点,就是如果遇到一个新行或者EOF直接返回。但是若fgets的缓存比一行字符大,那么会将换行符读到缓存里,反之若缓存比一行的字符小,则不会将换行符读到缓存里。 打个比方:缓存128个字节。若文件中某一行中有100个字节,则将将100个字节读到buffer里,第101个字节用'\n'存放,并且102个字节用'\0'填充(字符串结束标记); 若文件中某一行是128个字节,或者比128多的字节,则将127个字节读到buffer里,最后一个字节用'\0'填充。 接着下一次继续读取该行的字节,原理和上面一样判断剩余的一行字节是否大于缓存128个字节。[/quote] 如果一行有200个 我用长度100的buffer读取呢?[/quote] 额,我上面打出那么多字了,你还不明白吗? 第一次读取99个字节(最后一个给'\0'),第二次读取99个(最后也同样留给'\0'),第三次读取2个(这次会将换行符存放到缓存里,这次缓存是4个字节:2个有效字节,1个换行符,一个'\0')这样一行读完了。 不明白的话,建议你写个简单的程序测试一下嘛,编程能力的提高需要动手去写,改,调试。而不是停留在理论上。
bluestar2009 2018-03-16
  • 打赏
  • 举报
回复
引用 5 楼 cfjtaishan 的回复:
[quote=引用 2 楼 bluestar2009 的回复:] [quote=引用 1 楼 cfjtaishan 的回复:] 如果不确定一行的长度,为啥不用fgetc呢?用fgetc做一下判断,判断是否读到一行的末尾。
想逐行读···[/quote] 那用fgets吧,fgets有一个特点,就是如果遇到一个新行或者EOF直接返回。但是若fgets的缓存比一行字符大,那么会将换行符读到缓存里,反之若缓存比一行的字符小,则不会将换行符读到缓存里。 打个比方:缓存128个字节。若文件中某一行中有100个字节,则将将100个字节读到buffer里,第101个字节用'\n'存放,并且102个字节用'\0'填充(字符串结束标记); 若文件中某一行是128个字节,或者比128多的字节,则将127个字节读到buffer里,最后一个字节用'\0'填充。 接着下一次继续读取该行的字节,原理和上面一样判断剩余的一行字节是否大于缓存128个字节。[/quote] 如果一行有200个 我用长度100的buffer读取呢?
自信男孩 2018-03-16
  • 打赏
  • 举报
回复
引用 2 楼 bluestar2009 的回复:
[quote=引用 1 楼 cfjtaishan 的回复:] 如果不确定一行的长度,为啥不用fgetc呢?用fgetc做一下判断,判断是否读到一行的末尾。
想逐行读···[/quote] 那用fgets吧,fgets有一个特点,就是如果遇到一个新行或者EOF直接返回。但是若fgets的缓存比一行字符大,那么会将换行符读到缓存里,反之若缓存比一行的字符小,则不会将换行符读到缓存里。 打个比方:缓存128个字节。若文件中某一行中有100个字节,则将将100个字节读到buffer里,第101个字节用'\n'存放,并且102个字节用'\0'填充(字符串结束标记); 若文件中某一行是128个字节,或者比128多的字节,则将127个字节读到buffer里,最后一个字节用'\0'填充。 接着下一次继续读取该行的字节,原理和上面一样判断剩余的一行字节是否大于缓存128个字节。

33,311

社区成员

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

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