2012-12-26 38 views
1

GNU/Linux下,用下面的文件 'foo.csv'(當然\ r的是蘋果回車):獲取龜etc GNU/Linux下處理的Mac OS CR

0,1,2,3\r 
4,5,6,7\r 
6,9,10,11\r 

fgets函數將整個文件作爲一行返回。我如何指定fgets應該將\ r作爲換行處理?的C代碼

實施例:

#include <stdio.h> 

int main(int argc, char **argv) { 
     FILE *stream = fopen(argv[1],"r"); 
     char tmp[1024]; 
     int i=0; 
     while (fgets (tmp, 1024, stream) != NULL) { 
       printf("line %d\n", i); 
       i++; 
     } 
} 

我想避免一通到變換\ r =>\ n

+0

你有沒有試過''rt''模式與'fopen'?當你的問題是關於'fgets'的時候,你的標題爲什麼說'fgetc'? –

+0

我不知道先驗將是什麼文件的換行... 我修正了標題中的錯字,謝謝! – Sylvestre

+1

Mac OS X使用與Linux和其他遠程UNIX類操作系統相同的'\ n'。 Mac OS 9(2001之前)是最後使用'\ r'的。你看到的是來自WinDOS的'\ r \ n'(注意每個'\ r'後面有一個換行符)。 (編輯問題) – Potatoswatter

回答

1

在Linux和OSX上,都可以調用getdelim,它允許您指定分隔符。

2

也許使用getdelim作爲此頁上描述: http://www.gnu.org/software/libc/manual/html_node/Line-Input.html

注意getdelim(和getline)從與fgets的工作方式不同,所以你需要改變周圍的一點點你的代碼 - 特別是,你需要開始與char *ptr = NULLsize = 0;然後通過那些getdelim(&ptr, &size, '\r', stream); - 當你讀完整個文件時,請致電free(ptr);

編輯:要找出什麼行結尾的文件有:

int lineending(FILE *f) 
{ 
    int ch; 
    long fpos = ftell(f); 
    while((ch = fgetc(f)) != EOF) 
     if (ch == '\r' || ch == '\n') 
      break; 
    fseek(f, fpos, CUR_BEGIN); 
    return ch; 
} 

你去那裏。

+0

getline無法同時處理兩個問題:/ – Sylvestre

+0

@Sylvestre:「同時處理兩個問題」不是你問的問題。 –

+0

不,如果你想能夠讀取在多系統環境中創建的文件,那麼你需要編寫一個函數,它執行類似於getdelim()的函數,但需要例如一串字符,全部其中包括行結尾,或者讀取文件的第一行並查看它以什麼結尾,然後將其作爲參數傳遞給getdelim。我很想去做第一個。如果你確認這是你正在尋找的,我可以修改我的答案 –