在 Linux 的 C 语言编程中,如何使用标准库函数定位到一个文件某个字符串开始的位置

在 Linux 的 C 语言编程中,可以使用标准库函数 fseek() 和 ftell() 配合strstr函数来定位到一个文件某个字符串开始的位置


一、fseek()函数的使用

fseek() 用来将位置指针移动到任意位置,它的原型为:
int fseek(FILE *_FILE, long _Offset, int _Origin);

函数设置文件指针stream的位置,如果执行成功,stream将指向以fromwhere为基准,偏移量offset(指针偏移量)个字节的位置,函数返回0。如果执行失败则不改变strea.m指向的位置,函数返回一个0。
参数说明:

_FILE – 文件对象标识流的指针。

_Offset – 相对于_Origin偏移 的字节数。

_Origin – 开始偏移的位置:

在使用 fseek 函数后,再调用函数 ftell 就能非常容易地确定文件的当前位置。


二、ftell()函数的使用

ftell 函数的原型为:
long ftell(FILE *fp);
函数 ftell 用于得到文件位置指针当前位置相对于文件首的偏移字节数。在随机方式存取文件时,由于文件位置频繁的前后移动,程序不容易确定文件的当前位置。在文件末尾移动文件指针后,可使用 ftell()函数获取文件的总大小。可使用 SEEK_END常量来将文件指针移动文件末尾。

建立一个源文件:ftell-test_file.c,其代码以下所示 -指针

#include <stdio.h>  

void main() {
    FILE *fp;
    int datalength ;

    fp = fopen("test_file.txt", "r");
    fseek(fp, 0, SEEK_END);

    datalength = ftell(fp);

    fclose(fp);
    printf("Size of file: %d bytes", datalength );

}

三、strstr函数的使用

strstr 函数原型: char * strstr(char * haystack ,char * needle );

该函数的功能就是找出在字符串str1中第一次出项字符串str2的位置(也就是说字符串sr1中要包含有字符串str2),找到就返回该字符串位置的指针(也就是返回字符串str2在字符串str1中的地址的位置),找不到就返回空指针(就是 null)。
参数
haystack – 要被检索的 C 字符串。
needle – 在 haystack 字符串内要搜索的小字符串。

代码如下(示例):

#include <stdio.h>
#include <string.h>
 
int main()
{
   const char strhaystack[20] = "hello init menu string";
   const char strneedle[10] = "menu";
   char *fp;
 
   fp= strstr(strhaystack, strneedle);
 
   printf("子字符串是: %s\n", fp);
   
   return(0);
}

这个代码实现功能的是找出字符串str1中str2的第一个字符出现的位置并打印该字符串,我们编译并运行上面的程序,这将产生以下结果:
子字符串是: menu

四、使用标准库函数 fseek() 和 ftell() 来定位到一个文件某个字符串开始的位置

具体步骤如下:

打开文件并进行错误检查,可以使用 fopen() 函数。

从文件中读取数据到缓冲区中,可以使用 fgets() 或 fread() 函数。

在缓冲区中查找目标字符串,可以使用标准库函数 strstr()。

如果找到了目标字符串,则可以使用 ftell() 函数获取当前文件指针的位置。

使用 fseek() 函数将文件指针定位到目标字符串开始的位置,即 ftell() 函数返回的位置减去目标字符串长度。
下面是一个简单的示例代码:

#include <stdio.h>
#include <string.h>

int main() {
    FILE *fp;
    char buffer[1024], target[] = "hello";
    long int offset;

    fp = fopen("test.txt", "r");
    if (fp == NULL) {
        printf("Error opening file!\n");
        return 1;
    }

    while (fgets(buffer, 1024, fp) != NULL) {
        char *pos = strstr(buffer, target);
        if (pos != NULL) {
            offset = ftell(fp) - strlen(target);
            fseek(fp, offset, SEEK_SET);
            printf("Found target at position %ld\n", offset);
            break;
        }
    }

    fclose(fp);
    return 0;
}

五、 项目应用

例如我们需要通过应用代码c语言打开linux文件 /etc/profile 并修改IP地址参数进行保存,就需要用到以上方法进行设置,从ifconfig 开始覆盖修改,因为实际项目应用中临时设置IP是没用的需要重启也能生效,/etc/profile内容如下:

export PATH=/bin:/sbin:/usr/bin:/usr/sbin

if [ “$PS1” ]; then
if [ “id -u“ -eq 0 ]; then
export PS1=[\u@\h:\w]# ‘
else
export PS1=[\u@\h:\w]$ ‘
fi
fi

export PAGER=/bin/more ‘
export EDITOR=/bin/vi’

Source configuration files from /etc/profile.d
for i in /etc/profile.d/*.sh ; do
if [ -r “$i” ]; then
. $i
fi
unset i
done

ifconfig eth0 192.168.2.148 netmask 255.255.255.0
route add default gw 192.168.2.1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

章鱼哥嵌入式开发

坚持不易,你们的鼓励是我的动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值