我這次學習c語言的目的非常單純,就是嘗試將c語言應用在日常的分析任務重,解決實際問題。既然如此,那麼第一課就不是列印"hello world!" 了,畢竟說了那麼多次世界你好,依舊寫不好**。
我們第一課直接就來處理乙個實際的小需求,讀取fastq,將其轉成乙個fasta。處理這個問題和把大象放進冰箱裡一樣,都是分為三步,讀取資料,處理資料,輸出資料。其中第一步和第三步都是和檔案打交道,而第二步考驗的是對演算法,資料結構和記憶體等有關知識對理解。
我們應該如何讀取資料呢?如果r語言,我會用readlines("input.fasta")
直接讀取所有的資料。如果是我以前用的python, **會是下面的樣子
fi = open("input.fasta", "r")
for line in fi.readline():
print(line)
fi.close()
乍看起來,r好像比python寫的**要少很多。但其實python也可以一行完成,[line for line in open("input.fasta", "r"]
。將資料輸出到外部也差不多,基本上都能一行命令搞定。
總之,當你發現自己的**可以少寫了,其實是有人幫你簡化了。
回歸到c語言,所有的讀寫操作其實就是簡單地將位元組逐個移入程式中,將位元組逐個從程式中移出而已,類似於水流動的感覺。
我們要讓程式讀取資料和輸出資料,就相當於要搞乙個水管,把水引過來。下面**就是用file *
宣告了fi和fo這兩根水管
file *fi;
file *fo;
然後我們還需要把水管接到水流上。下面**的fopen
就是將我們之前對兩根水管分別接到了輸入檔案和輸出檔案上,引數中的"r"表示讀取(read), 而"w"表示寫出(write)。
fi = fopen("input.txt", "r");
fo = fopen("output.txt", "w");
//確保檔案能夠正常開啟
//否則退出
if ( fi == null )
水管接上了,那麼如何開啟水閥,讓水不斷地流入流出呢?一種是逐個字元操作,一種是逐行操作。前面的方法更加基礎,因為逐行讀取就是不斷的讀取乙個個字元,當碰到換行符時,就把前面的字元合在一起,以字串的形式傳遞,輸出是以行為單位,每一行也是乙個個字元的寫出。
通常讀取和寫出都伴隨著資料處理,因此這部分放到實際資料處理進一步介紹。
最後關閉水龍頭,我們需要用到fclose()
fclose(fi);
fclose(fo);
有了一些檔案讀寫的基本概念之後,我們就可以開始動手寫**了。
根據fastq和fasta的格式定義,fasta是一行以>
開頭的序列表示,之後跟著n條序列。而fastq則是標準的4行,第一行是以@
開頭的序列標示符,第二行是序列,第三行以+
開頭,第四行是第二行序列對應的質量資訊。處理過程描述如下
下面實際的**
#include #include #define max_line_length 1000
int main(int argc, char *ar**)
else if (argc == 3) else
char line[max_line_length];
int count=0;
while ( fgets(line, max_line_length, fi) != null )
if (count < 2) else
}if (++count > 3)
}fclose(fi);
if (argc == 3) fclose(fo);
return 0;
}
具體使用方法為
./fq2fa input.fq output.fa
目前****比較簡陋,至少存在下面這些問題
根據這些需求,我們就有了學習的目標,也就是後面課程的內容。
C語言實戰(一)
一 乙個價值三天的bug int fscanf file stream,char const format,int scanf char const format,int sscanf char const string,char const format,功能從輸入源讀取字元。函式的返回值就是轉換...
C語言實戰(二)
1 迴圈左移函式 rotl 和迴圈右移函式 rotr rotl 將乙個無符號整形數左迴圈移位的函式 原形 unsigned rotl unsigned value,int count 功能 將value向左迴圈移動count位。返回值 將value向左迴圈移動count位後的值。頭文件 stdlib...
將matlab的m檔案轉成C語言
實驗平台 1.microsoft visual studio 2010 2.matlab2012a實用鏈結 可能遇到的問題以及其他方面 let me show you the code myfun.m 這是加法計算,可以在build選項卡裡將其設定為3 x 3矩陣相加 function y myfu...