【问题标题】:replace a substring in a string in C, windows在C,windows中替换字符串中的子字符串
【发布时间】:2016-02-25 17:17:51
【问题描述】:

我想做以下事情:

  • 打开并读取ASCII文件

  • 定位子串(地理坐标)

  • 创建其替换(对原始坐标应用更正)
  • 覆盖原始子字符串(在原始文件中写入更正后的坐标)。

ASCII 文件的格式为: $GPGGA,091306.00,4548.17420,N,00905.47990,E,1,09,0.87,233.5,M,47.2,M,,* 53

我将只粘贴负责此操作的部分代码:

opnmea = fopen (argv[1], "r+");
if (fgets(row_nmea, ROW, opnmea)==NULL){             
   if (strstr(row_nmea,"$GPGGA")!=NULL) {
       sscanf(row_nmea+17, "%10c", old_phi);
       sscanf(row_nmea+30, "%11c", old_lam);
       sscanf(row_nmea+54, "%5c", old_h);
       fputs();
   }
}

到目前为止,我所做的是在变量中提取旧坐标,我正在考虑使用 fputs() 用新值覆盖旧坐标。但我做不到。不在此处的代码的另一部分是计算正确的坐标。我的想法是逐行更正,因为 fgets() 函数读取每一行。

如果有任何建议可以告诉我如何使用 fputs() 或其他函数来完成我的工作,我将不胜感激。我正在寻找一些简单的东西,因为我是 C 初学者。

提前谢谢你。

【问题讨论】:

  • 如果这是您想要而不是例如家庭作业——像 Python 这样的东西是更自然的选择,特别是如果你是 C 的初学者
  • if (fgets(row_nmea, ROW, opnmea)==NULL){ : == 错字为!=

标签: c text substring overwrite


【解决方案1】:

就地修补文本文件并不是解决此问题的好方法,原因有很多:

  • 修改后的版本可能有不同的长度,因此无法就地进行修补。

  • 标准流的读写操作不是那么容易正确处理并且破坏了缓冲机制。

  • 如果您在修补阶段遇到错误,部分修改的文件可能被视为已损坏,因为无法分辨哪些坐标已修改,哪些未修改。

  • 其他程序可能正在从您正在编写的同一文件中读取。他们将读取无效或不一致的数据。

我强烈建议编写一个程序来读取原始文件并将修改后的版本写入不同的输出文件。

为此,您需要:

  • 打开原文件阅读opnmea = fopen(argv[1], "r");

  • 打开输出文件进行写入:outfile = fopen(temporary_file_name, "w");

  • 复制不需要修改的行:只需调用fputs(row_nmea, outfile)

  • 在需要修改的行中解析相关数据,使用您喜欢的任何方法:sscanfstrtok、...

  • 计算修改后的字段并将修改后的行写入outfilefprintf

文件被完全正确处理后,您可以将原始文件替换为renamerename 操作通常在文件系统级别是原子操作,因此其他程序要么完成从先前版本的读取,要么打开新版本。

当然,如果文件只有一行,你可以简单地rewind 流并用fprintf 写回该行,但这是一种特殊情况,如果新版本短于原版的。截断多余的数据并不容易。另一种方法是在写入修改的行之前以写入模式 ("w") 重新打开文件。

【讨论】:

  • 该文件有很多很多行,每一秒坐标采集一个。非常感谢您的逐步指导。我会尽量听从你的建议。
  • 感谢您的帮助,我遵循了您的指导方针并且它有效。我使用 sscanf 和 %[^,] 来破坏字符串的字段,然后使用 frpintf 来构建具有更正坐标的新字符串。谢谢!
【解决方案2】:

我会推荐strtok(),然后是您的修订版,然后是strcat()

strtok() 将允许您使用逗号作为分隔符分隔行,因此您将可靠地获得所需的字段。您可以将行拆分为单独的字符串,修改您希望的坐标,然后使用 strcat() 重新组合行,包括逗号。

这些页面也包含很好的用法示例:

http://www.cplusplus.com/reference/cstring/strtok/ http://www.cplusplus.com/reference/cstring/strcat/?kw=strcat

【讨论】:

  • 我会试试的。谢谢!
  • 我看不出这是如何回答这个问题的。 OP 想知道如何将修改后的字符串写回文件。
  • @chqrlie,虽然帖子详细说明了一些事情,包括读取和写入文件,但标题侧重于子字符串替换。我的回答非常直接地解决了这个问题。我希望这会有所帮助。
  • 您的建议是用strtok 将原始字符串分解成块,并用strcat 组成一个新字符串。这确实是一个解决方案,但 OP 可能会错误地使用 strcat 来修补原始字符串,并且有充分的理由无法使其正常工作。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-25
  • 1970-01-01
  • 2012-04-03
  • 2013-07-23
相关资源
最近更新 更多