首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在C中用LF替换CR LF

在C中用LF替换CR LF
EN

Stack Overflow用户
提问于 2017-12-11 20:44:11
回答 1查看 4K关注 0票数 1

我必须编写一个功能有点像dos2unix的C程序。将所有的CR LF替换为LF (DOS格式改为Unix格式).所以这就是我的方法。每次我读一行时,我都会通过查找\0搜索数据的末尾,然后检查下面是否是\r\n。如果是,仅用\n替换。但它似乎不工作,线CRLF here从来没有打印过一次。

代码语言:javascript
复制
char data[255]; // save the data from in.txt
char *checker;
pf = fopen("in.txt", "r");
pf2 = fopen("out.txt", "w");
while (feof(pf) == 0)
{
    fgets(data, 255, pf);       // Read input data
    checker = data;
    while (checker != "\0") // Search for a new line
    {
        if (checker == "\r\n") // Check if this is CR LF
        {
            printf("CRLF here");
            checker = "\n";   // replace with LF
        }
        checker++;
    }
    fputs(data, pf2);       // Write to output data
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-12-11 21:04:47

你有一大堆虫子:

  • 首先,您可能需要在in.txt模式下打开"rb"模式,而不是"r"模式,以查看CRLF行的结尾。
  • 您可能需要在out.txt模式下打开"wb"模式,而不是"w"模式,以防止C库取消您的工作。
  • 不能将字符串文本与==进行比较。您可以将字符串的一个字符与字符文字与==进行比较,但这不是您要做的,它只适用于单个字符;CRLF序列是两个字符。
  • 通过简单的赋值,不能用可变C字符串中的单字符序列替换两个字符序列。在替换一个字符之后,您需要使用memmove来移动所有字符。
  • 你不能很好地处理长队。
  • 您不检查fopen是否成功,也不检查任何其他I/O错误。
  • is always wrong

编写此程序的一个更好的方法是使用一个逐字符的主循环,如下所示

代码语言:javascript
复制
  int c;
  while ((c = getc(ifp)) != EOF) {
    if (c == '\r') {
      putc('\n', ofp);
      c = getc(ifp);
      if (c == EOF) break;
      if (c == '\n') continue;
    }
    putc(c, ofp);
  }

这可以将\r\n和bare \r转换为\n,因为bare \r现在非常少见,但在某些历史OSes (特别是经典的MacOS)中被用作行终止符,并且没有任何其他明智的方法。

重要的是,c应该是一个int,而不是一个char,这样它就可以保存EOF以及所有可能的字符。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/47761108

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档