【问题标题】:How to extract and delete some text in a file and delete it in C++如何提取和删除文件中的某些文本并在 C++ 中将其删除
【发布时间】:2019-05-18 13:00:38
【问题描述】:

我正在寻找删除用 C++ 生成的文件中的某些文本行。 事实上,我在我的服务器上收到了一个使用微软库 C++ Rest SDK aka Casablanca 制作的文件。

我提取了我的内容请求并将其插入到一个文件中。 这是我现在在我的文件中得到的一个例子:

"----------"

----------------379412310113082987734398 内容处置:表单数据;名称=“文件”;文件名="2.png" 内容类型:image/png

‰PNG

IHDR Å } \Mï sRGB ®Îé gAMA ±üa pHYs à ÃÇo¨d 0IDATx^íÁkG‡}ÌÑ@rÌÿ Ó Œfa6Q´ŠÀ‹‚«%b&ƒµ,{˜›î›öU½êîêîšQ÷¸4VÏü¾ƒ]SÕ]ÕÝRªêê©wî € àS °| v€O Àð) Ø> ;À§ø ì Ÿ €àS °|

BLABLABLA 我文件的其余内容....

----------------379412310113082987734398--

我想删除以下行: --------------379412310113082987734398 内容处置:表单数据;名称=“文件”;文件名="2.png" 内容类型:图片/png (这里有空格) --------------379412310113082987734398--

我想知道如何删除它以生成我的二进制文件。 提前感谢您的宝贵帮助。

---------------"

【问题讨论】:

    标签: c++ text


    【解决方案1】:

    您可以读取您的文件并写入一个新文件,不包括您不想要的行。

    为此,您可以迭代文件并使用正则表达式检查每一行。

    正则表达式允许您指定输入必须具有的形式。

    您应该确定输入的哪一部分是固定的,哪一部分是可变的,以便构建正确的正则表达式。

    http://www.cplusplus.com/reference/regex/

    再见


    我在这里放了一点代码:

    #include <stdio.h>
    #include <iostream>
    #include <regex>
    #include <string>
    
    using namespace std;
    int main()
    {
        string inputLine="----------------------------379412310113082987734398 Content-Disposition: form-data; name=\"file\"; filename=\"2.png\" Content-Type: image/png ";
        regex regularExpression("[-]+[0-9]+ Content-Disposition: form-data; name=\".+\"; filename=\".+\" Content-Type: .+ ");
    
        if(regex_match(inputLine,regularExpression))
            cout<<"REGEX OK"<<endl;
        else
            cout<<"REGEX FAIL"<<endl;
    }
    

    inputLine 是您的线路。 正则表达式是指定输入格式的方法。

    这个

    "[-]+[0-9]+ Content-Disposition: form-data; name=\".+\"; filename=\".+\" Content-Type: .+ "
    

    表示您的输入由以下人员组成:

    • 1 个或多个“-”carachers [-]+
    • 1 个或多个数字 [0-9]+
    • 固定字符串 > 其中name="" 和filename=\".+\" 的内容可以是任何东西,Content-Type 可以是任何东西。 注意字符串开头和结尾的空格。

    请注意,我假设可变部分是:

    • “-”个数
    • 位数
    • 姓名
    • 文件名
    • 内容类型

    如果您输入的格式不同,您必须修改正则表达式。

    【讨论】:

    • 感谢 ilroci,他在我的文件中也使用了“ëPNG”和“0”的问题。你知道如何不接受或考虑吗?我需要它,因为我将生成一个二进制文件,而不是从 http 请求接收到的文件
    • 谢谢ilroci,但我需要的是,如果是thios,我不接受,否则没关系。但我无法获得好的内容。或者您知道如何删除该代码上的当前行吗?它需要“‰PNG”和“0”,但我不想用正则表达式考虑它们。你有什么想法吗?
    • 嗨,您不能直接从文件中删除该行。你必须创建一个新文件。正则表达式是我得到的最好的解决方案。也许其他人会给你一个更好的解决方案。再见!
    【解决方案2】:

    以二进制模式打开文件,从 infile 中读取行,然后将它们一一写入 outfile,直到找到以“----------------”开头的行------------379412310113082987734398"(使用 strncmp() 检查这种情况)。

    然后丢弃该行而不写它。然后继续读取(并丢弃)行,直到找到再次匹配“----------------------------379412310113082987734398”的行。

    然后读入并写出剩余的行。

    【讨论】:

    • 我不认为在这种情况下以二进制模式打开真的有帮助。
    • @πάνταῥεῖ OP 指定二进制,所以是二进制。
    • OP 并没有指定很多内容。
    • @πάνταῥεῖ 嗯,好吗?这并没有改变 OP 指定二进制的事实。
    • 直到到达以“----------------------------379412310113082987734398”开头的行是的,但你不能搜索这一行 :----------------379412310113082987734398 它永远不是相同的边界结果
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-23
    • 2019-01-31
    • 2013-03-23
    • 1970-01-01
    • 2014-04-19
    相关资源
    最近更新 更多