| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2647 人关注过本帖
标题:一个在文件中查找字符,并且返回行号的程序。
只看楼主 加入收藏
清扬_栾
Rank: 1
等 级:新手上路
帖 子:7
专家分:4
注 册:2017-4-14
结帖率:0
收藏
已结贴  问题点数:20 回复次数:6 
一个在文件中查找字符,并且返回行号的程序。
虽然确实可以达到我想要的目标,但是总觉得剑走偏锋过甚了。有没有哪位大神,可以弄一个比较合乎常理的程序代码。
程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(void)
{
    char c,b,buffer[256],data[35],*loc,buff[80];
    char fname[20];
    int count,x=0,y,a=0;
    FILE *fp;
    printf("请输入文件名: ");
    gets(fname);
    if((fp=fopen(fname,"rb"))==NULL)
    {
        printf("打开文件失败.\n");
        exit(1);
    }
    printf("请输入你要查找的内容.\n");
    scanf("%s",data);
    for(count=0;count<256;count++)
    {
        c=fgetc(fp);
        if(!feof(fp))
        {
            buffer[count]=c;
            buffer[count+1]='\0';
        }
        if(c=='\n')
        {
            x++;
        }
    }
    loc=strstr(buffer,data);
    if(loc==NULL)
    {
        printf("您所要的数据不再其中.\n");
        exit(1);
    }
    strcpy(buff,loc);
    for(y=0;y<strlen(buff);y++)
    {
        c=buff[y];
        if(c=='\n')
        {
            a++;
        }
    }
    printf("您所要的数据在第 %d 行.\n",(x-a)+1);
    fclose(fp);
    return 0;
}
搜索更多相关主题的帖子: color 
2017-05-03 17:53
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:5 
感觉题主说这样要读完整个文档判断不太合理吧~那可以试试逐个逐个字符匹配~匹配成功则继续匹配下一个字符~不成功就从第一个字符开始重新匹配~找到完全匹配的字符就可以结束读取文件~最近没啥时间敲代码了~可以先自己弄弄看~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-03 18:11
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:5 
差不多就是这样了。
getstring()函数,用fgets()代替,但是需要将数个指针替换为数组。

程序代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "d:\mylib\getstring.h"

int
main( void )
{
    FILE *InFile;
    char *Str, *Dst;
    char *Fname;
    char *T;
    int Line;

    printf( "输入要打开的文件名:" );
    Fname = getstring( stdin );
    Fname[ strlen( Fname ) - 1 ] = '\0';
    if( NULL == ( InFile = fopen( Fname, "r") ) )
        exit( EXIT_FAILURE );
    free( Fname );

    printf( "输入要对比的字符串:" );
    Dst = getstring( stdin );
    Dst[ strlen( Dst ) - 1 ] = '\0';
    
    for( Line = 1; NULL != ( Str = getstring( InFile ) ); ++Line, free( Str ) )
        if( NULL != ( T = strstr( Str, Dst ) ) )
            break;
    if( NULL != T )
        printf( "出现在第%d行。\n", Line );
    else
        printf( "字符串%s没有出现在文件中", Dst );
    free( Str );
    free( Dst );
    fclose( InFile );

    return 0;
}


[此贴子已经被作者于2017-5-3 18:46编辑过]


09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-03 18:27
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 3楼 renkejun1942
看到要包含"d:\mylib\getstring.h"
就问一下~你那个getstring函数是库函数还是自定义的?看起来很方便的样子~~



[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-05-03 19:13
renkejun1942
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:不是这样
等 级:贵宾
威 望:33
帖 子:1645
专家分:5297
注 册:2016-12-1
收藏
得分:0 
回复 4楼 九转星河
我自己写的。

https://bbs.bccn.net/thread-475272-1-1.html

09:30 05/21 种下琵琶种子,能种活么?等待中……
21:50 05/27 没有发芽。
20:51 05/28 没有发芽。
23:03 05/29 没有发芽。
23:30 06/09 我有预感,要发芽了。
2017-05-03 19:24
吹水佬
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:451
帖 子:10609
专家分:43210
注 册:2014-5-20
收藏
得分:5 
也可以边读一行边搜寻
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

main()
{
    char buffer[256],data[35];
    char fname[FILENAME_MAX];
    int count=0;
    FILE *fp;
    printf("请输入文件名: ");
    gets(fname);
    if((fp=fopen(fname,"r"))==NULL)
    {
        printf("打开文件失败.\n");
        exit(1);
    }
    printf("请输入你要查找的内容.\n");
    scanf("%s",data);
    while (fgets(buffer,256,fp) != NULL)
    {
        if (strstr(buffer,data) != NULL)
        {
            ++count;
            printf("您所要的数据在第 %d 行.\n", count);
            puts(buffer);
        }
    }
    if (count == 0)
    {
        printf("您所要的数据不再其中.\n");
    }
    fclose(fp);
    return 0;
}
2017-05-03 21:11
rjsp
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:528
帖 子:9031
专家分:54061
注 册:2011-1-18
收藏
得分:5 
文件的行长是无限制的

假设待搜索字符串长度为a
开辟一个大于a的空间,假设为b
fgets读入,搜索
如果行未结束,则将尾部的b-1字符memmove至缓冲区首部,fgets读入,搜索
如果行结束,行号加1

若不使用“内存映射文件”,又想效率高的话
可以开辟一个 (s-1) + 4k的倍数 的空间,文件以无缓冲方式打开,每次“4k的倍数”读一段,……

2017-05-04 09:31
快速回复:一个在文件中查找字符,并且返回行号的程序。
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.165375 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved