| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2982 人关注过本帖, 1 人收藏
标题:朋友们可以讲解一下这个代码吗?(尽量详细一点好吗,麻烦了)读取文件到内 ...
只看楼主 加入收藏
钟鼓窈窕
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2019-4-26
结帖率:33.33%
收藏(1)
已结贴  问题点数:20 回复次数:13 
朋友们可以讲解一下这个代码吗?(尽量详细一点好吗,麻烦了)读取文件到内存是分配给字符串吗?特别是字符串搜索那一部分的,里边的for循环和if语句不是太明白,感谢
#include <stdio.h>
#include <string.h>
#include <memory.h>
#include <malloc.h>

const char* TARGET_FILE = "C:\\Users\\Lubin\\Desktop\\test.txt";

const char* target_string_val = "hello";
const char* replace_string_val = "how are you";

int main(void)
{
    FILE* fp = NULL;
    long i, size = 0L;
    char* mem, *tmp;

    size_t target_string_len;
    size_t replace_string_len;

    target_string_len = strlen(target_string_val);
    replace_string_len = strlen(replace_string_val);

    /* 打开文件 */
    fp = fopen(TARGET_FILE, "rb");
    if (NULL == fp) {
        perror("fopen failed");
        goto END;
    }

    /* 获取文件大小 */
    fseek(fp, 0, SEEK_END);
    size = ftell(fp);
    fseek(fp, 0, SEEK_SET);
    printf("=== File size is %ld bytes\n", size);
    if (size < target_string_len) {
        printf("no match\n");
        goto END;
    }

    /* 读取全部文件到内存 */
    mem = (char*)calloc(size, 1);
    if (NULL == mem) {
        perror("calloc failed");
        goto END;
    }
    fread(mem, 1, size, fp);
    tmp = mem;

    /* 重开文件用于写 */
    fclose(fp);
    fp = fopen(TARGET_FILE, "wb");

    /* 字符串搜索 */
    for (i = 0L; i <= size - target_string_len; ++i) {
        if (memcmp(mem + i, target_string_val, target_string_len) == 0) {
            printf("== find match at offset %ld\n", i);
            /* 写入开始到目标字符串的内容 */
            if (mem + i - tmp) {
                printf("== write %ld bytes header\n", mem + i - tmp);
                fwrite(tmp, 1, mem + i - tmp, fp);
            }
            /* 写入替换字符串 */
            printf("== write replace string\n");
            fwrite(replace_string_val, 1, replace_string_len, fp);

            tmp = mem + i + target_string_len;
            printf("== update tmp = %s\n", tmp);
            i += target_string_len - 1;
        }
    }

    /* 写入尾部(结尾不是目标字符串的情况) */
    if (tmp < (mem + size)) {
        printf("== write tail %ld bytes\n", mem + size - tmp);
        fwrite(tmp, 1, mem + size - tmp, fp);
    }
    printf("=== Replace END\n");

    fclose(fp);
    free(mem);

    //pause
END:
    getchar();

    return 0;
}


[此贴子已经被作者于2019-9-15 18:56编辑过]

搜索更多相关主题的帖子: printf 文件 tmp 字符串 size 
2019-09-15 18:50
星泪成寒
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:6
帖 子:76
专家分:539
注 册:2013-5-19
收藏
得分:10 
1.只读方式打开文件
2.获取文件大小
3.用文件大小申请内存
4.把文件的内容全部读取到内存中
5.关闭文件,用写模式打开文件
6.在内存中找目标字符串,找到后把目标字符串前面的内容写入文件,
7.把目标字符串替换成指定的字符串写入文件(6.7循环)
8.写入目标字符串后续的字符
9.完成了文件中替换字符串的功能
2019-09-15 20:51
game9688
Rank: 2
等 级:论坛游民
帖 子:26
专家分:13
注 册:2008-4-26
收藏
得分:10 
不错学习一下。
for (i = 0L; i <= size - target_string_len; i++) {
        if (memcmp(mem + i, target_string_val, target_string_len) == 0) {
            printf("== find match at offset %ld\n", i);
            /* 写入开始到目标字符串的内容 */
            printf("%d\n",mem + i - tmp);
            if (mem + i - tmp) { //移动指针到指定写入位置 hello 前
                printf("== write %ld bytes header\n", mem + i - tmp);
                fwrite(tmp, 1, mem + i - tmp, fp);  //tmp中取mem+i-tmp长度(hello前) 写入 fp 这时的指针指向了文件尾
            }
            /* 写入替换字符串 */
              printf("== write replace string\n");
            fwrite(replace_string_val, 1, replace_string_len, fp); //继续写 how are you替换hello

            tmp = mem + i + target_string_len;  //整体上保持一致性
            printf("== update tmp = %s\n", tmp);
            i += target_string_len - 1;  
// 不断的向 fp 文件尾加数据直到结束。
        }
    }


[此贴子已经被作者于2019-9-15 23:59编辑过]

2019-09-15 23:38
钟鼓窈窕
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2019-4-26
收藏
得分:0 
回复 3楼 game9688
请问第一层大if语句中,那个memcmp是怎么一回事呢
2019-09-16 12:26
钟鼓窈窕
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2019-4-26
收藏
得分:0 
回复 2楼 星泪成寒
谢谢啦,主要就是不明白字符串的搜索中的第一个for循环和第一个if语句中memcmp
2019-09-16 12:27
game9688
Rank: 2
等 级:论坛游民
帖 子:26
专家分:13
注 册:2008-4-26
收藏
得分:0 
回复 4楼 钟鼓窈窕
if (memcmp(mem + i, target_string_val, target_string_len) == 0)
字符串比较,比方
mem="abhello 1235",
mem+0 字符串="abhello 1235",  和 target_string_val 比较
mem+1 字符串="bhello 1235",  ...
mem+2 字符串="hello 1235",   .... 找到

2019-09-16 13:10
钟鼓窈窕
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2019-4-26
收藏
得分:0 
回复 6楼 game9688
奥,突然明白了一点,就是在if条件句里target_string_len这个参数规定了要比较的字符串的长度
target_string_val这个参数是目标字符串,
mem + i是在文件中比较,如果和target_string_val一样,就说明找到了,对吧。
2019-09-16 13:23
钟鼓窈窕
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2019-4-26
收藏
得分:0 
回复 6楼 game9688
还有就是我知道tem是临时变量
但是mem是什么呢
2019-09-16 13:42
game9688
Rank: 2
等 级:论坛游民
帖 子:26
专家分:13
注 册:2008-4-26
收藏
得分:0 
回复 8楼 钟鼓窈窕
tmp 和 mem 都是指针,指向相的地址。
2019-09-16 19:11
钟鼓窈窕
Rank: 1
等 级:新手上路
帖 子:16
专家分:0
注 册:2019-4-26
收藏
得分:0 
回复 9楼 game9688
就相当于是将文件读取后,都给了字符串,mem是字符串的头指针,
然后if(mem+i-tem)是判断目标字符串前面是否为空
那这一句tmp = mem + i + target_string_len;,是把什么附给了tem呢?
还有就是谢谢你的讲解
2019-09-16 19:47
快速回复:朋友们可以讲解一下这个代码吗?(尽量详细一点好吗,麻烦了)读取文件 ...
数据加载中...
 
   



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

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