在C中丢弃马车返回?

时间:2014-05-15 23:38:40

标签: 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存在。什么?

2 个答案:

答案 0 :(得分:8)

您正在看到“文本模式”的效果,其中行结尾从Windows转换为Unix又名C换行符。

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

另外,我不确定为什么在阅读之前你得到文件的长度。

请阅读它。查看fread的返回值,看看你读了多少。如果使用size为1,则返回值将是读取的字节数。

像这样:

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

答案 1 :(得分:4)

以二进制格式textFile = fopen("./Test.txt", "rb+");打开文件。目前,您正在阅读文本格式, \ r \ n 将被正确转换。

相关问题