c - 害怕在 C 中删除回车符?

标签 c fread carriage-return

我希望能够读入 Windows 文本文件,在内存中修改它,然后用修改后的数据覆盖旧文件。但是,fread 似乎没有存储出现在我的 Windows 文本文件中的回车符,当我覆盖旧数据时,它会把东西扔掉。我找不到其他人似乎遇到过这个问题。

下面是一些演示问题的示例代码:

#include <stdio.h>
#include <stdlib.h>

int main()
{
    FILE* textFile;
    long fileSize;
    char fileCharacterBuffer[100];

    int i;
    for(i = 0; i < 100; i++)
    {
        fileCharacterBuffer[i] = '\0';
    }

    textFile = fopen("./Test.txt", "r+");

    fseek(textFile, 0L, SEEK_END);
    fileSize = ftell(textFile);
    fseek(textFile, 0L, SEEK_SET);

    fread(fileCharacterBuffer, 1, fileSize, textFile);
}

测试文件:

3
112
REd
110
green

#5/09/2014
5087 - 5/6/2014

它的十六进制转储,显示它的 EOL 是\r\n:

Offset(h) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F

00000000  33 0D 0A 31 31 32 0D 0A 52 45 64 0D 0A 31 31 30  3..112..REd..110
00000010  0D 0A 67 72 65 65 6E 0D 0A 0D 0A 23 35 2F 30 39  ..green....#5/09
00000020  2F 32 30 31 34 0D 0A 35 30 38 37 20 2D 20 35 2F  /2014..5087 - 5/
00000030  36 2F 32 30 31 34 0D 0A                          6/2014..

在 fread 之后,GDB 将 fileCharacterBuffer 打印为:

"3\n112\nREd\n110\ngreen\n\n#5/09/2014\n5087 - 5/6/2014\n", '\000' <repeats 51 times>

只有\n 出现。什么?

最佳答案

您将看到“文本模式”的效果,其中行尾从 Windows 转换为 Unix 也就是 C 换行符。

您需要以二进制模式打开文件,这意味着向 fopen 标志添加“b”。它看起来像 textFile = fopen("./Test.txt", "rb+")

此外,我不确定我是否理解为什么您在读取文件之前就知道了文件的长度。

刚看完。查看fread的返回值,看看读了多少。如果您使用的 size 为 1,则返回值将是读取的字节数。

像这样:

fileSize = fread(fileCharacterBuffer, 1, sizeof(fileCharacterBuffer), textFile);

关于c - 害怕在 C 中删除回车符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23690436/

相关文章:

php - 在没有额外标记的情况下,在 SQL 中保留回车以供 HTML 显示?

php - 在 PDF 中插入换行符

c - 在 Rust 中使用类似 C 的结构数组

c - 基于比特选择的算法效率

c++ - 在 C++ 中从 PNG 中读取 RGB 值

c - 在 C 中解析/读取位图文件

c - 在 C 递归中使用 char 输入

c - 使c中的矩阵计算更快

c++ - 读取二进制文件 C++

batch-file - 批处理 : delete line feed from end of text file?