代码之家  ›  专栏  ›  技术社区  ›  boddhisattva

不可编辑文件和不可读(用于进一步处理)文件(为什么?)经过C++程序处理后

  •  -4
  • boddhisattva  · 技术社区  · 15 年前

    :)这对你来说可能是一个很长的问题,我明白,但相信我,这并不长。我无法确定为什么在处理完此文本后,无法阅读和编辑。我尝试在python中使用ord()函数来检查文本是否包含除ASCII字符之外的任何Unicode字符(非ASCII字符)。我发现了很多。 我有一种强烈的感觉,这可能是由于原始文本本身(输入)。

    输入文件:只需复制粘贴到文件中” acle5v1.txt

    下面这段代码的目的是检查大写字符,并将其转换为小写字符,同时删除所有标点符号,以便对这些单词进行进一步的对齐处理。

    #include<iostrea>
    #include<fstream>
    #include<ctype.h>
    #include<cstring>
    
    using namespace std;
    
    ifstream fin2("acle5v1.txt");
    ofstream fin3("acle5v1_op.txt");
    ofstream fin4("chkcharadded.txt");
    ofstream fin5("chkcharntadded.txt");
    ofstream fin6("chkprintchar.txt");
    ofstream fin7("chknonasci.txt");
    ofstream fin8("nonprinchar.txt");
    
    int main()
    {
    char ch,ch1;
    fin2.seekg(0);
    fin3.seekp(0);
    int flag = 0;
    
                while(!fin2.eof())
        {
            ch1=ch;
            fin2.get(ch);
    
            if (isprint(ch))// if the character is printable
                flag = 1;
    
            if(flag)
            {
                fin6<<"Printable character:\t"<<ch<<"\t"<<(int)ch<<endl;
                flag = 0;
            }
            else
            {
                fin8<<"Non printable character caught:\t"<<ch<<"\t"<<int(ch)<<endl;
            }
    
            if( isalnum(ch) || ch == '@' || ch == ' ' )// checks for alpha numeric characters
            {
                fin4<<"char added: "<<ch<<"\tits ascii value: "<<int(ch)<<endl;
                if(isupper(ch))
                {
                    //tolower(ch);
                    fin3<<(char)tolower(ch);
                }
                else
                {
                    fin3<<ch;
                }
            }
            else if( ( ch=='\t' || ch=='.' || ch==',' || ch=='#' || ch=='?' || ch=='!' || ch=='"' || ch != ';' || ch != ':') && ch1 != ' ' )
            {
                fin3<<' ';
            }
            else if( (ch=='\t' || ch=='.' || ch==',' || ch=='#' || ch=='?' || ch=='!' || ch=='"' || ch != ';' || ch != ':') && ch1 == ' ' )
            {
                //fin3<<" ';
            }
            else if( !(int(ch)>=0 && int(ch)<=127) )
            {
                fin5<<"Char of ascii within range not added: "<<ch<<"\tits ascii value: "<<int(ch)<<endl;
            }
            else
            {
                fin7<<"Non ascii character caught(could be a -ve value also)\t"<<ch<<int(ch)<<endl; 
            }   
        }
        return 0;
    }
    

    我有一个 类似的 上面用python编写的代码给了我一个otput,它同样不可读也不可编辑。

    python中的代码如下:

    #!/usr/bin/python
    # -*- coding: UTF-8 -*-
    
    import sys
    
    input_file=sys.argv[1]
    output_file=sys.argv[2]
    
    list1=[]
    
    f=open(input_file)
    for line in f:
        line=line.strip()   
        #line=line.rstrip('.')   
        line=line.replace('.','')
        line=line.replace(',','')
        line=line.replace('#','')
        line=line.replace('?','')
        line=line.replace('!','')
        line=line.replace('"','')
        line=line.replace('।','')
        line=line.replace('|','')       
        line = line.lower() 
        list1.append(line)
        f.close()
    
        f1=open(output_file,'w')
    
        f1.write(' '.join(list1))
    
        f1.close()
    

    文件在运行时接收IP和OP。AS:

    python punc_remover.py acle5v1.txt acle5v1_op.txt
    

    此文件的输出位于“acle5v1_op.txt”中。

    现在,在处理完这个特定的输出文件之后,需要进一步处理。这个特定的文件“aclee5v1_op.txt”是一个不可读的和不可编辑的文件,我无法使用它进行进一步的处理。我需要这个在NLP中进行单词对齐。我尝试用以下程序读取此输出

    #include<iostream>
    #include<fstream>
    
    using namespace std;
    
    ifstream fin1("acle5v1_op.txt");
    ofstream fout1("chckread_acle5v1_op.txt");
    ofstream fout2("chcknotread_acle5v1_op.txt");
    
    int main()
    {
        char ch;
        int flag = 0;
        long int r = 0; long int nr = 0;
    
        while(!(fin1))
        {
            fin1.get(ch);
    
            if(ch)
            {
                flag = 1;
            }
    
            if(flag)
            {
                fout1<<ch;
                flag = 0;
                r++;
            }
            else
            {
                fout2<<"Char not been able to be read from source file\n";
                nr++;
            }
        }
    
        cout<<"Number of characters able to be read: "<<r;
        cout<<endl<<"Number of characters not been able to be read: "<<nr;
    
        return 0;
    }
    

    如果字符可读,则打印字符;如果不可读,则不打印字符,但我观察到两个文件的输出都是空白的,因此我可以得出结论,即该文件“acle5v1_op.txt”不可读且不可编辑。你能帮我解决这个问题吗?

    为了告诉您一点关于原始输入文件acle5v1.txt的统计信息,该文件中大约有3441行,其中大约有300万个字符。

    记住,您编辑的文件中的字符数可能/可能无法打开该文件。我可以打开费多拉10的Gedit文件,我目前正在使用。这只是为了通知您,用特定的编辑器打开实际上并不是一个问题,至少在我的情况下……

    如果可以,我可以使用诸如python和perl这样的脚本语言来处理这个问题吗?如何处理?请具体说明一下,因为我是Perl和Python的新手。或者你能告诉我如何用C++本身解决这个问题吗?谢谢你……:)我真的很期待关于如何解决这个问题的一些帮助或指导。

    1 回复  |  直到 15 年前
        1
  •  2
  •   Adrien Plisson    15 年前

    (现在我可以回复了,我花了一些时间编辑了这篇文章。发布时,请使用预览并阅读帮助!)

    毫无疑问,python无法解决…这个问题肯定可以用python来解决。

    在修改了一些python脚本之后(缩进混乱!),我可以处理从您的链接复制的内容,输出很好(但仍然包含一些标点符号,如“:”和“()”。

    您说,在第一个处理步骤之后,输出是不可读和不可编辑的,但是在处理之后输出文件的内容是什么?您是否尝试在编辑器中打开它并查看文件中的内容?如果第一步不起作用,那么在第一步更正代码并将问题集中在第一步。尝试使用调试器查看代码在哪里失败。

    就我个人而言,我怀疑一个编码问题:您的输入文件是纯ASCII文件吗?或者它是用Unicode编码的?

    请注意,3MB文件不多。如果这对您造成了一些问题,请更改您的编辑器!(试试jedit,epsilon,emacs,vi…)