fprintf忽略^ M回车

时间:2014-04-24 01:24:50

标签: c printf line-endings

我的fopen设置如下。我用“t”和没有“t”尝试了我的fopen。由于某种原因,我的fprintf打印出^ M,这是回车。如何阻止frpintf这样做?我想只使用普通的新行字符。

FILE *outputfp;
// +5 to have space for .txt and terminator 
char *fname = calloc(strlen(argv[1]) + 5, sizeof(fname[0])); 
strcpy(fname, argv[1]);
strcat(fname, ".lst");
outputfp = fopen (fname, "w");
//printf("Above error message\n");
if (outputfp == NULL)
{
    printf("Error while opening the file.\n");
    return 1;
}
fprintf(outputfp, "hello\n");

http://en.wikipedia.org/wiki/Control_character http://www.pixhost.org/show/4770/21527928_cr.jpeg

我正在使用Fedora,我用gcc编译它

更新

    if((int)line[0] == 46)
    {
        //printf("You have a period \n");
        //printf("%s", line);
        for(i = 0; i < 80; i++)
        {
            //fprintf(outputfp,"%c", line[i]);
            if (isprint((unsigned char)line[i]) || isspace((unsigned char)line[i]))
             { 
             printf("%c", line[i]);
             //fprintf(outputfp, "\n Print something \n");
             fprintf(outputfp,"%c", line[i]);
             }

            //printf("%c", line[i]);
            //printf("  %d %c  ", line[i], line[i]);
        }
        //fprintf(outputfp, "\n ");
        //printf(" ------------------------\n");
        memset(line, 0, 80);
        comment_flag = 1; 
    }

        //sscanf(line, "%s %s %x", label, mneumonic , &start_address);
        //printf("start_address %d \n", start_address);
        printf("%x %s %s %s %x\n", start_address, label, mneumonic, operand, start_address);
        fprintf(outputfp, "%x %s %s %s %x\n", start_address, label, mneumonic, operand, start_address);

实际上看起来这就是它不喜欢的线。我想在打印一个新的行字符之前循环遍历整个数组。

fprintf(outputfp,"%c", line[i]);

更新

char line[80] = {0};
while(fgets(line, 80, input) != NULL)

1 个答案:

答案 0 :(得分:1)

"t"是默认值。如果您想要二进制模式,请使用"wb"打开。

文本流(默认)可以在磁盘文件和C程序看到的内容之间执行各种转换;二进制流意味着具有1-1字符映射(尽管这当然是所有实现定义的)。

更新:由于您使用的是Linux,因此文本或二进制模式可能没有问题。

根据您的输出屏幕截图,您似乎实际上在文件中写了\r。第一行没有。如果您实际显示生成该输出的代码,它会有所帮助。也许您正在从具有\r\n行结尾的文件中读取这些行。

更新#2:事实证明,\r字符来自正在读入的文件,然后在通过过滤器if (isprint((unsigned char)line[i]) || isspace((unsigned char)line[i]))后逐字输出

isspace功能允许" \t\n\v\f\r"全部通过。你需要修改这个检查;也许你也可以阻止\r\f;或者,停止使用isspace并检查' ' '\t',并在循环后恢复"\n"的输出。