在C打印垃圾中添加回车功能?

时间:2014-02-12 04:36:25

标签: c console text-files line-endings

我在C中有以下程序,用于将UNIX文本文件转换为Windows格式(LF-> CR LF)。基本上,命令行中的预期用法是addcr infile > outfile

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char *argv[])
{
    FILE *fp;
    char *buffer;
    int i, flen;
    if(argc<2)
    {
        printf("Usage: addcr filename\n");
        return 0;
    }
    fp=fopen(argv[1], "r");
    if(fp==NULL)
    {
        printf("Couldn't open %s.\n", argv[1]);
        return 0;
    }
    fseek(fp, 0, SEEK_END);
    flen=ftell(fp);
    rewind(fp);
    buffer=(char*)malloc(flen+1);
    fread(buffer, 1, flen, fp);
    fclose(fp);
    buffer[flen]=0;
    for(i=0;i < strlen(buffer);i++)
    {
        if(buffer[i]==0x10)
        {
            printf("%c", '\r');
        }
        printf("%c", buffer[i]);
    }

    free(buffer);
    return 0;
}

但是,有时它会在文件内容的末尾打印出垃圾,如将其输出与TYPE命令进行比较所示:

C:\Temp>addcr sample.txt
He did not wear his scarlet coat,
                 For blood and wine are red,
               And blood and wine were on his hands
                 When they found him with the dead,
               The poor dead woman whom he loved,
                 And murdered in her bed.
Window
C:\Temp>type sample.txt
He did not wear his scarlet coat,
                 For blood and wine are red,
               And blood and wine were on his hands
                 When they found him with the dead,
               The poor dead woman whom he loved,
                 And murdered in her bed.

C:\Temp>

似乎有时会在我的环境变量中打印出一些不可预测的字符串部分。我完全不知道是什么导致它。有谁知道如何解决这个问题?

3 个答案:

答案 0 :(得分:1)

由于stdout在文本模式下运行,如果您在Windows操作系统上运行此功能,则不应明确编写'\r'。它会自动将'\ n'翻译为'\r' '\n'(并以正确的顺序执行!)。

答案 1 :(得分:1)

我认为这里发生的事情是输入文件已经有CRLF行分隔符,并且您已在文本模式下打开它。然后,您会使用fread,并将其转换为换行符('\n')。

由于您首先要求文件大小,这比您读入的翻译文本的长度长6个字节。这意味着在终止位置flen的缓冲区之前,最后6个字节未初始化。

fread实际上会返回读取的字节数。你应该注意这个值。

size_t bytes_read = fread(buffer, 1, flen, fp);

试试吧。输出bytes_read的值和flen的值。我敢打赌他们是不同的。此外,您实际上不必终止缓冲区并使用strlen来获取长度。这样做真的很难看。你已经知道了它的长度 - 它是bytes_read。所以在循环中使用它。

如果您想避免这种混淆,您应该以二进制模式打开文件 - "rb",而不是"r"

答案 2 :(得分:-1)

buffer最后没有\ 0,所以strlen(buffer)将继续计数直到找到\ 0 - 所以它会返回略高于{{1的实际长度}}