【问题标题】:End of line character / Carriage return行尾字符/回车
【发布时间】:2014-07-10 13:22:39
【问题描述】:

我正在读取一个普通的文本文件并将所有单词作为数字写入另一个文本。当一行结束时,它会查找“换行符 (\n)”并从新行继续。在 Ubuntu 中它可以完美执行,但在 Windows (DevC++) 中它无法运行该功能。我的问题是我阅读的 Windows 中的文本没有换行符。即使我用手放了新行,我的程序也看不到它。当我想在行尾打印字符时,它说它是一个空格(ascii = 32),我很确定我是行尾。这是我的行尾控制代码,我该怎么做才能修复它?我读到了一个叫做“回车(\r)”的字符,但它也不能解决我的问题。

c = fgetc(fp);
printf("%d", c);
fseek(fp, -1, SEEK_SET);
if(c == '\n' || c == '\r')
    fprintf(fp3, "%c%c", '\r', '\n');

【问题讨论】:

  • windows 行分隔符是“\r\n”。
  • 如何在我不知道的 if 语句中一起提及它,例如 '\r\n' ) @ElliottFrisch
  • 问题是 Windows 在行尾不使用单个字符。它使用两个。首先是回车符 ('\r'),然后是换行符 ('\n')。古老版本的 Mac(例如 pre X)单独使用 '\r'。
  • \r\n 是您实际发送到终端和打印机以获取新行的内容;仍然是终端/控制台模拟器。没有ASCII换行,\n被翻译成ASCII LF,换行不带回车;它在 unix 上作为换行符的解释是完全传统的。

标签: c file text carriage-return end-of-line


【解决方案1】:

这里有几个问题

  1. windows文本换行和unix文本换行有什么区别?

    UNIX 换行符仅是 LF。 ASCII 码 0x0a。 Windows 换行符是 CR + LF。 ASCII码0x0d和0x0a

  2. 你的文件有 LF 还是 CR ?

    使用十六进制编辑器查看文件的内容。我在 linux 上使用 xxd。

    $ xxd unix.txt
    0000000: 0a0a 
    $ xxd windows.txt
    0000000: 0d0a 
    

【讨论】:

    【解决方案2】:

    如果您正在打开文本文件并希望进行换行符转换,请以"r" 模式打开文件,而不是"rb"

    FILE *fp = fopen(fname, "r");
    

    这将以文本模式而不是二进制模式打开,这是您想要的文本文件。在 linux 上似乎没有区别,但在 windows 上,\r\n 将被翻译成\n

    一种可能的解决方案似乎是将文件中的数字直接读入int 变量。

    int n;
    fscanf(fp, "%d", &n);
    

    除非换行符对你有重要意义。

    【讨论】:

    • 我尝试在“rb”和“r”中打开文件;没有区别。我认为我的文本没有新的行,但我也自己放了它们。我不明白这个问题。问题可能与文本文件有关吗?
    • @mrtgnccn 如果它没有换行符那么你为什么要检查\n
    猜你喜欢
    • 2010-10-26
    • 2016-02-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-31
    • 1970-01-01
    • 2014-05-17
    • 1970-01-01
    相关资源
    最近更新 更多