我正在尝试从具有某些条件的特殊字符中清除我的数据文件,但不满足这些条件?
Posted
技术标签:
【中文标题】我正在尝试从具有某些条件的特殊字符中清除我的数据文件,但不满足这些条件?【英文标题】:I am trying to clean my data file from special characters with some conditions, but those conditions are not met? 【发布时间】:2013-07-10 22:57:04 【问题描述】:这是我的代码
此代码试图从 .txt 文件中删除特殊字符,如 ",',,,(,) 并用空格替换它们。
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include <string.h>
#include <stdio.h>
#include <fcntl.h>
#include <iostream>
#include <time.h>
#include <fstream>
using namespace std;
int main(int argc, char *argv[])
int fd;
int i;
int j;
int len;
int count = 0;
int countcoma = 0;
int countquote = 0;
char buf[10];
char spec[] = ',','"',':','','','(',')','\'';
fd = open(argv[1],O_RDWR,0777);
while (read(fd,buf,10) != 0)
len = strlen(buf);
for (i=0;i<len;i++)
for (j=0;j<8;j++)
if (buf[i]==spec[j])
count =1;
countquote=0;
if (j==1)
if (countcoma == 0)
countcoma++;
if (countcoma == 1)
countcoma--;
if ((j==7) && (countcoma ==1))
countquote = 1;
break;
//cout<<countquote;
if ((count != 0) && (countquote == 0))
buf[i] = ' ';
count = 0;
lseek(fd, -sizeof(buf), SEEK_CUR);
write(fd,buf,sizeof(buf));
memset(buf,' ',10);
return 0;
现在我希望文件中双引号内的单引号保持不变,但所有特殊字符都替换为代码中提到的空格。 我希望这些单引号保持不变“what's”,但是在我运行文件后它变成了 what s 而不是 what's
【问题讨论】:
主啊!整理一下代码好吗!没必要这么难读。 这段代码想做什么?您应该给我们一个代码摘要,然后告诉我们您的问题。 为什么你需要这里显示的代码中的所有@include
?
看看正则表达式。
lseek 不可能正确 - 如果文件长度不是 10 字节大小的精确倍数怎么办?
【参考方案1】:
看看regex 和其他库。 (在 UNIX 上输入 man regex
。)现在您不必再编写此代码了,有无数库可以为您完成此操作。
【讨论】:
不能使用这些库中的任何一个。 好的,但为什么不呢?你可以使用很多其他的东西来查看你的#include
's。【参考方案2】:
好的,所以你的代码的问题是你正在做一件事,然后你在下一节中撤消。特别是:
if (countcoma == 0)
countcoma++;
if (countcoma == 1)
countcoma--;
遵循逻辑:我们将countcoma
设为零。所以第一个if
是真的,它会增加。现在是1
。接下来如果说if (countcoma == 1)
所以它现在是真的,我们减少它。
我将其替换为countcoma = !countcoma;
,这是一种更简单的方式来表示“如果为 0,则将其设为 1,如果为 1,则将其设为 0. You could put an
elseon the back of the first
if` 以进行相同的操作。
还有一大堆风格的东西:例如硬编码的常量,写回原始文件(意味着如果有错误,你会丢失原始文件 - 还好我没有关闭编辑器带有我的示例文件的窗口...),包括头文件中的一半宇宙,并根据索引确定它是哪个spec
字符。
【讨论】:
【参考方案3】:在我看来,您的代码存在比之前指出的更普遍的缺陷:
char buf[10]; /* Buffer is un-initialized here!! */
while (read(fd,buf,10) != 0) /* read up to 10 bytes */
len = strlen(buf); /* What happens here if no \0 byte was read? */
...
lseek(fd, -sizeof(buf), SEEK_CUR); /* skip sizeof(buf) = 10 bytes anyway */
write(fd,buf,sizeof(buf)); /* write sizeof(buf) = 10 bytes anyway */
memset(buf,' ',10); /* initialize buf to contain all spaces
but no \0, so strlen will still result in
reading past the array bounds */
【讨论】:
以上是关于我正在尝试从具有某些条件的特殊字符中清除我的数据文件,但不满足这些条件?的主要内容,如果未能解决你的问题,请参考以下文章
数据字符串中具有分隔符/特殊字符的 Redshift 卸载命令