69,371
社区成员
发帖
与我相关
我的任务
分享
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define BUF_SIZE 1024
#define KEY " EF 01 FF FF FF FF 07 00 07 00"
#define KEY_LEN 31
int main()
{
int ch = 0;
int first = 1;//开始时的标志,因为是一个字符一个字符的扫描
int flag = 0;//文件开头是不是所要读内容的标志
int count = 0;//遇到'\n'的个数
int pre_pos = 0, cur_pos = 0;//前一次和当前文件指针的位置
char buf[BUF_SIZE] = {0};
FILE *fp = NULL;
fp = fopen("123.txt", "r");
FILE*ft=fopen("1234.txt","w");
if (fp == NULL)
{
printf("Cann't open the file!\n");
exit(1);
}
else
{
while ((ch = fgetc(fp)) != EOF)
{
if (first)
{
//若要读取的内容在文件开头就有时
//移动指针到文件开头
fseek(fp, -1L, SEEK_CUR);
fgets(buf, KEY_LEN, fp);
if (strcmp(buf, KEY) == 0)
{
first = 0;
flag = 1;
continue;
}
else
{
first = 0;
}
}
if (ch == '\n')
{
count++;//遇到'\n'的个数
pre_pos = cur_pos;//上次遇到'\n'时文件指针的位置
cur_pos = ftell(fp);//当前遇到'\n'时文件指针的位置
//文件开头内容符合要求的就适当移动指针位置
//然后读取输出来
if (count == 1 && flag == 1)
{
fseek(fp, 0L, SEEK_SET);
memset(buf, 0, sizeof(buf));
fgets(buf, cur_pos - 1, fp);
printf("%s\n", buf);
}
//之后内容符合要求的就适当移动指针位置
//然后读取输出来
else
{
memset(buf, 1, sizeof(buf));
fgets(buf, KEY_LEN, fp);
if (strcmp(buf, KEY) == 0)
{
fseek(fp, 1, SEEK_CUR);
memset(buf, 0, sizeof(buf));
fgets(buf, cur_pos-1-pre_pos, fp);
fputs(buf,ft);
printf("%s\n", buf);
}
}
}
}
}
fclose(fp);
fclose(ft);
return 0;
}
# include <stdio.h>
# define N 501
int BF(char a[],char b[])//BF算法 a为主串,b为被检验的串`返回b在a中的第一个下标
{
int i=0,j=0;
while (a[i]&&b[j])
if (a[i++]==b[j]) ++j; // 继续比较后继字
else (i-=j)&&(j=0);
return b[j]?0:i; //返回
}
int main(){
int F,i=1;
char A[N];
char B[]={"07 00 07 00"};
char result[6] = { "" };
freopen("123.txt","r",stdin);
while(gets(A))
{
F=BF(A,B);
if(F)
{
A[F + 7] = '\0';
strncpy(result, A+1+F, 5);
printf("idx:%d %s -> %s\n", x, A, result);
}
x++;
}
return 0;
}
# include <stdio.h>
# define N 501
int BF(char a[],char b[])//BF算法 a为主串,b为被检验的串`返回b在a中的第一个下标
{
int i=0,j=0;
while (a[i]&&b[j])
if (a[i++]==b[j]) ++j; // 继续比较后继字
else (i-=j)&&(j=0);
return b[j]?0:i; //返回
}
int main(){
int F,i;
char A[N];
char B[]={"07 00 07 00"};
freopen("123.txt","r",stdin);
while(gets(A))
{
F=BF(A,B);
if(F)
{
A[F+4]='\0';
puts(A+F);
}
}
return 0;
}
我对文件读取不太了解 希望 这个函数 BF 应该能帮到你,如果需要其他标志 可以改改B[]字符串#include <stdio.h>
#include <conio.h>
#include <windows.h>
#include <wincon.h>
FILE *f;
char c;
long offset;
char patch[3]="\x1b\x6d";//\x00 default
void main(int argc,char **argv)//".vs\0\x31\0\0\x1f\x00\x08"->".vs\0\x31\0\0\x1b\x6d\x00"
{
if (argc!=2) {
printf("VxPatch filename.vx");
getch();GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT,0);
return;
}
if (NULL==(f=fopen(argv[1],"r+b"))) {
printf("----------Can not find %s!",argv[1]);
getch();GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT,0);
return;
}
while (1) {
c=fgetc(f);
if (feof(f)) break;//
if (c=='.') {
c=fgetc(f);
if (feof(f)) break;//
if (c=='v') {
c=fgetc(f);
if (feof(f)) break;//
if (c=='s') {
c=fgetc(f);
if (feof(f)) break;//
if (c=='\0') {
c=fgetc(f);
if (feof(f)) break;//
if (c=='\x31') {
c=fgetc(f);
if (feof(f)) break;//
if (c=='\0') {
c=fgetc(f);
if (feof(f)) break;//
if (c=='\0') {
c=fgetc(f);
if (feof(f)) break;//
if (c=='\x1f') {
c=fgetc(f);
if (feof(f)) break;//
if (c=='\x00') {
c=fgetc(f);
if (feof(f)) break;//
if (c=='\x08') {
offset=ftell(f);
offset=offset-3;
fseek(f,offset,SEEK_SET);
if (3!=fwrite(patch,1,3,f)) {
fclose(f);
printf("----------%s VxPached fwrite error!",argv[1]);
getch();GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT,0);
} else {
fclose(f);
printf("OK.");
}
return;
} else break;//
} else break;//
} else if (c=='\x1b') {
fclose(f);
printf("%s is VxPatched. Please type vlc.err!",argv[1]);
getch();GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT,0);
return;
} else break;//
}
}
}
}
}
}
}
}
fclose(f);
printf("----------%s is not a unVxPached .vx file!",argv[1]);
getch();GenerateConsoleCtrlEvent(CTRL_BREAK_EVENT,0);
}