[英]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.