在 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