2011-05-11 45 views
4

我在Visual Studio 2008 C++項目中定義了一個資源文件。問題是,使用LockResource方法獲取資源數據後,生成的char緩衝區包含Carriage返回和換行,其中原始數據僅包含Line提要。例如,如果原來的行包含:刪除回車char *(C++)

00 0A FC 80 00 00 27 10 00 0A FC 80 00 00 27 10

將所得的char *包含也回車返回(0D):

00 0D 0A FC 80 00 00 27 10 00 0D 0A FC 80 00 00

我嘗試下面的代碼來擺脫他們,但是這導致兩個回車和換行被刪除:

for (int i = 0; i < sz; ++i) 
{ 
    // Ignore carriage returns 
    if (data[i] == '\n') continue; 
    // ... 
} 

如何擺脫馬車迴歸但留下換行字符?

編輯:

爲了使其更具體。我寫的字符緩衝區到文件:

std::ofstream outputFile(fileName.c_str()); 

for (int i = 0; i < sz; ++i) 
{ 
    // Ignore carriage returns 
    // if (data[i] == '\r') continue; This leaves both CR and LF 
    // if (data[i] == 0x0D) continue; This leaves both CR and LF 
    if (data[i]) == '\n') continue; //This removes both CR and LF 
    outputFile << data[i]; 
} 
+0

發佈更多驗證碼。 – 2011-05-11 12:09:04

+2

'\ r'將匹配回車符。 – verdesmarald 2011-05-11 12:09:50

回答

2

使用'\r',而不是'\n'在給定的代碼?

+0

雖然你的回答是正確的,請參閱@ veredesmarald的答案。它解釋了原因。我不會低估你,但下次試着更努力地解釋你自己。 – 2011-05-11 12:14:55

+0

@the_drow什麼? @ veredesmarald的答案是完全錯誤的。 – 2011-05-11 12:15:49

+0

@KonradRudolph:在這種情況下,這個答案是錯誤的。爲什麼它錯了? – 2011-05-11 12:16:45

4

下面是一個就地轉換它的例子。變量i是正在讀取的字符的索引,變量j是正在寫入的字符的索引。當你路過回車,i將開始「超車」 j

#include <stdio.h> 

int main(void) 
{ 
    char s[100] = "This is a test.\n\rThis is only a test.\n\r"; 

    for(int i = 0, j = 0; s[i] != '\0'; i++) 
    if(s[i] != '\r') 
     s[j++] = s[i]; 

    printf("%s", s); 
} 
2

的燒烤'\n'相當於換行,0x0A'\r'對應於回車,0x0D。如果您只想刪除回車,請使用它。

你的代碼將不是順便去掉兩個;它只會刪除換行並使回車就位。

此外,有沒有這樣的東西作爲Windows上的「新行字符」,因爲Windows(不像其他的操作系統)通常使用個字符數序列來表示換行符:"\r\n"。這也是加載資源時更改字節序列的原因:Windows認爲您正在加載文本並自動將所有可能的換行符轉換爲規範形式。爲防止出現這種情況,請不要將資源加載爲文本,而應將其作爲原始字節序列(如果可能的話)。

最後,根據顯示字符串的方式,其他字符序列也會導致換行符。例如,所有現代編輯(這意味着:不是記事本)將接受任何換行符序列來創建換行符,可以是'\r''\n'"\r\n"

6

當您爲文本文件寫入'\ n'時,它會被轉換爲'行尾結束'。在你的情況下,這看起來像'\ r \ n'。當您從文本文件中讀取時,「行尾序列」被轉換回單個「\ n」字符。因此,對於正常處理,這個額外的字符不應該影響你(假設你以文本文件的形式打開讀/寫)。

如果您不希望將'\ n'轉換爲'行尾序列',則以二進制格式打開該文件。完成此操作後,不會對'\ n'字符進行處理。

std::ofstream outputFile(fileName.c_str(), std::ios::binary); 
             // ^^^^^^^^^^^^^^^^ 

但要注意:該文件表示應該不會影響你。如果您打開文件並將文件作爲文本讀取,則\ r \ n將在您的應用程序中轉換回單個'\ n'字符。

+0

+1爲真正的原因 – 2011-05-11 12:37:42

2

您只需要以二進制模式打開文件即可。像這樣:

std::ofstream outputFile(fileName.c_str(), std::ios::out | std::ios::binary); 
+0

很棒。這個竅門!我不想在第一個地方發佈更多的代碼。感謝大家的支持。 – BadCoder 2011-05-11 12:51:31