在文件中搜索 printf 语句并替换为字符串值

Posted

技术标签:

【中文标题】在文件中搜索 printf 语句并替换为字符串值【英文标题】:search printf statement in file and replace with string value 【发布时间】:2012-06-17 17:55:17 【问题描述】:

我正在尝试用字符串值替换所有 printf 语句。所以首先,我正在读取所有行到一个字符串,如下所示:

 ifstream ifs;
 ifs.open(filename);
 string temp;
 string text;
 while(!ifs.eof())
 
     getline(ifs, temp, '\t');
     text.append(temp);
     temp.clear();
 

然后我会找到printf 的每一行,如果找到了,而不是用"printf statement" 替换它。 我的替换printf的代码:

char ch;
while(getline(is,check))

 ch=check[0];
    if(!isalpha(ch))
     
      //statements..
     
    else
     
        string str2("printf");
        size_t found;
        found=check.find(str2);
           if(found!=string::npos)
              check="\n printf statement.\n";
       OriginalStr.append(check);

         check.clear();
     

它适用于三个四行文件,如下所示:

main()

Hi i am Adityaram.
and i am good boy.
and you?
printf("");

printf("");
Aditya
printf("");
Rammm
printf("");
Kumar
printf("");

printf("");

printf("");

printf("");

printf("");

但在这些文件行中没有找到 printf 行。

main()

   char ch, file_name[25],*p;
   char answer[400];
   int size=0;
   FILE *fp;

   printf("Enter the name of file you wish to see ");
   gets(file_name);

为什么找不到 printf 行?或者怎么办? 任何建议将不胜感激。

【问题讨论】:

您不必在函数开头声明所有变量。不要在 C++ 中这样做,它只会破坏代码的可读性。 行可能为空。您永远不会检查它,然后当您执行 ch=check[0]; 时,您正在调用未定义的行为。 Perl 等语言更适合此类任务。如果您至少不知道一种具有内置 reg ex 支持等的语言,那么请帮自己一个忙并学习一门。 eof 几乎总是错误的,而且在你的情况下肯定是错误的。 【参考方案1】:

由于这是一个 C 程序,您可能会有如下几行:



即。打开/关闭一个块。这绝对不是空的,但它只会包含 1 个字符。在您的while i<6中,您将在此缓冲区结束之后继续前进。因此,添加一个检查 i 是否小于缓冲区的长度。

那么可能会发生 printf 不一定是该行的第一个表达式,例如:

if(something) printf("this");

您的代码无法识别。您需要在wd 中检查“printf”作为子字符串。查看http://www.cplusplus.com/reference/string/string/find/ 以获取在字符串中查找字符串的参考。

最后但并非最不重要的一点是,我不明白为什么您希望您的行以字母开头(检查 isalpha)。这将无法更改代码,如

 printf("this"); 

它适用于小型测试文件的原因是因为您编写它们很可能是为了通过内部“测试”,但大型文件通常包含更广泛使用的 printf。

此外,缩进并非必须与制表符 (\t) 一起发生,它可能是简单的空格。

【讨论】:

大文件比怎么办。【参考方案2】:

我明白了,通过这种简单的方式:

string RemovePrintf(string value)

     string RemovedPrintf,strP;
     size_t poss;
     value.insert(0," ");//insert a white-space, cause  find method not returning position if it present at begin of string.
     poss = value.find("printf");    // position of "printf" in str
     strP = ""; // get insert whitespace at "printf line".
     strP.resize(strP.length());
     if((int)poss > 0)
      RemovedPrintf.append(strP);
     else
      RemovedPrintf.append(value);
     strP.clear();
     RemovedPrintf.resize(RemovedPrintf.length());
     return RemovedPrintf;

这适用于小文件和大文件。 顺便感谢您回答我的问题。

【讨论】:

以上是关于在文件中搜索 printf 语句并替换为字符串值的主要内容,如果未能解决你的问题,请参考以下文章

sh 搜索文本文件中的字符串并替换它们

如何使用sed搜索和替换]、[? [关闭]

linux下批量查询文件内容字符串并替换

在文本文件中搜索和替换字符串

如何使用 Perl 进行批量搜索和替换?

在C++中搜索和替换txt文件中的字符串