0

これが私のコードです

このコードは、",',{,},(,) などの特殊文字を .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 になります。

4

3 に答える 3

2

正規表現と他のライブラリを見てください。(UNIX の場合は と入力しman regexます。) 最近では、これをコーディングする必要はなくなりました。これを行うことができる無数のライブラリがあります。

于 2013-07-10T23:12:52.740 に答える
1

わかりました。コードの問題は、次のセクションで元に戻すという 1 つのことを行っていることです。特に:

                    if (countcoma == 0) {
                        countcoma++;
                    }
                    if (countcoma == 1) {
                        countcoma--;
                    }

論理に従ってくださいcountcoma。ゼロとして入ってきます。したがって、最初ifは真であり、インクリメントされます。今1です。次の ifif (countcoma == 1)は今は true であり、デクリメントします。

countcoma = !countcoma;これをもっと簡単に「0なら1にする、1なら0にする」に置き換えて、同じ. You could put anものon the back of the firstを作ってみました。

文体的なものもたくさんあります: たとえば、ハードコードされた定数、元のファイルに書き戻す (つまり、バグがある場合、元のファイルを失うことを意味します。サンプル ファイル...)、ヘッダー ファイルにユニバースの半分を含めspec、インデックスに基づいてどの文字かを判断します。

于 2013-07-10T23:13:38.283 に答える