如何更改文本文件中序列的字母?

Posted

技术标签:

【中文标题】如何更改文本文件中序列的字母?【英文标题】:How can I change the letters of a sequence in a text file? 【发布时间】:2021-05-12 19:57:11 【问题描述】:

我必须改进和扩展这段代码。详细地说,我有一个带有基因型代码(即 AGGGGCCCTATTCGCCC .....)的文本文件,想要像这样更改这些代码:

A -> T

G -> C

C -> G

T -> A

我的意思是 A 更改为 T 就像上面一样。然后我将这个新代码保存在我的文件中。

如果您能指导我完成此过程,我将不胜感激。

#include <iostream>
#include <fstream>
#include <vector>
#include <string>

int readFile (std::string Genotype, std::vector<std::string>& fileContent)


    // Opening the Genotype file
    std::ifstream CGenotype("AT.txt");

    // Checking if object is valid
    if (CGenotype.fail())
    
        std::cout << "Cannot open the Genotype File : " << Genotype << std::endl;
        return EXIT_FAILURE;
    

    if (CGenotype.peek() == std::ifstream::traits_type::eof())
    
        std::cout << "The file is empty: " << Genotype << std::endl;
        return EXIT_FAILURE;
    
    std::string str;
    // Reading the next line from genotype file untill it reaches the end.
    while (std::getline(CGenotype, str))
    
        // Line contains string of length > 0 then save it in vector
        if (str.size() > 0)
        
            fileContent.push_back(str);
        
    
    //Closing the genotype file
    CGenotype.close();
    return EXIT_SUCCESS;


int writeFile (std::string Genotype, std::vector<std::string>& fileContent)

    std::string str;
    while (std::getline(CGenotype, str))
    
    if (str== 'A';
    cout << 'T';
    else if (str== 'T';
    cout << 'A';
    else if (str== 'C';
    cout << 'G';
    else if (str== 'G';
    cout << 'C';
    
    CGenotype.close();
 
int main()

    std::vector<std::string> fileContent;

    // Getting the contents of genotype file in a vector
    int fileCheck = readFile("AT.txt", fileContent);

    if (!fileCheck)
    
        // Printing the vector contents
        for (std::string& line : fileContent)
            std::cout << line << std::endl;
    

【问题讨论】:

【参考方案1】:

我在想这样的事情(在适当的地方嵌入解释):

#include <algorithm>
#include <iterator>
#include <fstream>
#include <filesystem>
int main()

    
        // open input and disposable temporary output file
        std::ifstream in("in.txt");
        std::ofstream out("out.txt");
        
        //read character from input file, write transformed character to output file
        std::transform(std::istream_iterator<char>(in),
                         std::istream_iterator<char>(),
                         std::ostream_iterator<char>(out),
                         [](char val)
                         
                             switch(val)
                             
                                 case 'A': return 'T';
                                 case 'G': return 'C';
                                 case 'C': return 'G';
                                 case 'T': return 'A';
                                 default: return val;
                             
                         );
     // RAII closes open files here
    
    // replace input file
    std::filesystem::remove("in.txt"); 
    std::filesystem::rename("out.txt", "in.txt");

没有像其他答案那样将文件转换到位的理由:如果出现任何问题,直到输入文件被输出文件替换,输入文件都没有损坏。在失败的情况下,像半转换文件这样的损坏窗口是最小的。

【讨论】:

【参考方案2】:

这样的事情怎么样?这个版本处理每个字符,而不是每一行。为了简短起见,我没有包含任何特定于域的错误处理。

我假设您想处理每个单独的字符...并且每个字符都被替换为内联或保持原样。

int main() 
    // ... Open the file (will default to both read and write)
    std::fstream s("AT.txt");
   
    // ... Get initial position (i.e., 0)
    long pos = s.tellp() ;

    // ... Repeat: read a character until you can't  
    while ( s.seekp(pos++) ) 
        // ... Parse the current character
        switch( s.peek() ) 
        case 'A': s.write("T", 1); break ; // ... replace inline
        case 'G': s.write("C", 1); break ; // ... replace inline
        case 'C': s.write("G", 1); break ; // ... replace inline
        case 'T': s.write("A", 1); break ; // ... replace inline
        default:                   break ; // ... nothing to translate
        
    
    // .... File will close automagically
    return EXIT_SUCCESS ;

【讨论】:

我认为您可以使用int ch; while ((ch = s.peek()) != std::char_traits&lt;char&gt;::eof()) 之类的方式消除所有的告诉和搜索,然后打开ch 也许不是。如果没有替换,我的音高中的文件指针将不会前进。无论如何,可能值得进行不必要的更换。可能比在文件中四处寻找便宜

以上是关于如何更改文本文件中序列的字母?的主要内容,如果未能解决你的问题,请参考以下文章

部件 。如何遍历字符串,在文本文件中写出特殊字符、数字和字母?

如何使用python更改文本框中的特定字母颜色

写一个Linux C程序,将一个文本文件中的所有小写字母转换为大写字母。

如何在pygame中更改一段文本的颜色

如何读取具有 ANSI 编码和非英文字母的文本文件?

VSCode 扩展 - 如何更改文件的文本