簡體   English   中英

從char *中刪除回車符(C ++)

[英]Remove Carriage Returns from char* (C++)

我在Visual Studio 2008 C ++項目中定義了一個資源文件。 問題是在使用LockResource方法獲取資源數據后,生成的char緩沖區包含Carriage Returns和Line Feeds,其中原始數據僅包含Line feed。 例如,如果原始行包含:

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

結果char *還包含Carriage Returns(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;
    // ...
}

如何擺脫回車但留下新行字符?

編輯:

使其更具體。 我正在將char緩沖區寫入文件:

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];
}

當您向文本文件寫'\\ n'時,它將轉換為'行結束序列'。 在你的情況下,這看起來像'\\ r \\ n'。 當您從文本文件中讀取時,“行結束序列”將轉換回單個“\\ n”字符。 所以對於正常處理,這個額外的字符不應該影響你(假設你打開兩個讀/寫文本文件)。

如果您不希望將'\\ n'轉換為'行結束序列',則將文件打開為二進制文件。 完成此操作后,不會對'\\ n'字符進行任何處理。

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

但請注意 :文件表示不應該影響您。 如果您打開並以文本形式讀取文件,'\\ r \\ n'將在應用程序中轉換回單個'\\ n'字符。

這是一個將其轉換為就地的示例。 變量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);
}

在給定代碼中使用'\\r'而不是'\\n'

char '\\n'對應於換行符0x0A '\\r'對應於回車符0x0D 如果您只想刪除回車符,請使用它。

順便說一句,你的代碼不會刪除這兩個代碼; 它只會移除換行並將回車留在原位。

此外,Windows上沒有“新行字符”,因為Windows(與其他操作系統不同)通常使用字符序列來表示換行符: "\\r\\n" 這也是加載資源更改字節序列的原因:Windows認為您正在加載文本並自動將所有可能的換行符轉換為規范形式。 為防止這種情況,請不要將資源作為文本加載,而是作為原始字節序列加載(如果可能的話)。

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

您所要做的就是以二進制模式打開文件。 像這樣:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM