C for循环无法正确打印,字符乱序

时间:2015-09-29 18:18:46

标签: c arrays special-characters fgetc

编辑:我现在意识到我需要问的问题是我将如何捕获dat文件中的回车符“^ M”抛弃我的输出,如下所示。

我的程序从文件中读取字符,将它们放入一个数组中,一旦数组已满,它就会转储输入。该文件包含我猜测可能导致问题的特殊字符。我正在读取字符然后以十六进制格式打印它们的数值,然后在下一行我想以字符形式打印相同的信息。

任何人都可以告诉我为什么我的for循环似乎跳了起来?数组可能加载不正确吗?

file.dat FILE - 包含

之后的标签
This is a test of               program^M

Special characters are: ^L ^H ^K

输出: - 使用格式化%x

打印输出
54 68 69 73  69 73  61  74 65 73 74  6f 

66   70 72 6f 67 72 61 6d d  53 70 

65 63 69 61 6c  63 68 61 72 61 63 74 65 72 73 

 61 72 65 3a  c  8  b   ffffffff 72 73 

输出以十六进制形式正确,翻译时它是我想要和需要的输出

输出: - 输出错误

T h i s  i s  a  t e s t  o 

   S p  o g r a m 3 

e c i a l  c h a r a c t e r s 

 a r e :  

                ? r s 

这个输出显然是错误的,对我来说很困惑。我不明白一个简单的for循环是如何导致这个输出的。

CODE:

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

void print_group(char array[]);
void print_space(int num);
void printbits(int bits);
int main()
{
    char array[16];
    char i_file;
    int count = 0;
    FILE *fp;
    int bits = 0;
    int a = 0;

    fp = fopen("file.dat","r");

    if( fp == NULL)
    {
        printf("ERROR");
    }
    else
    {
        while (!feof(fp)) /*while pointer hasnt reached end of file continue loop*/
        {
            array[count] = fgetc(fp);

            if(count == 15 || feof(fp))
            {
                print_group(array);
                count = -1;
                printf("\n");
            }
            count++;
        }
    }

    fclose(fp);

    return 0;
}

void print_group(char array[])
{
    int a;
    int num;

    for(a = 0; a <= 15; a++)
    {
        /*This for loop wil print the numbers that are associated with the dump
        of the array.*/
        if(array[a] == ' ' || array [a] == '\t' || array[a] == '\n' || array[a] == '\?')
        {
            printf("20 ");
        }
        else
            printf("%x ",array[a]);
    }

    printf("\n");

    for(a = 0; a <= 15; a++)
    {
        /*This for loop wil print the characters that are associated with the dump
        of the array.*/
        if (array[a] == ' ' || array [a] == '\t' || array[a] == '\n' || array[a] == '\?') {
            printf(" ");
        }
        else
            printf("%c ",array[a]);
    }
}

void print_space(int num)
{}

3 个答案:

答案 0 :(得分:1)

虽然(!eof)错了

在调用feof()之前,始终需要检查read(fread(),fscanf()或fgetc())的返回值。

喜欢它比你期望的更多次进入循环。如果存在读取错误,则循环永远不会终止。

尝试:

int c;

while ((c = fgetc(fp)) != EOF) {
    // do something with c
}
if (ferror(fp)) {
    // handle the error, usually exit or return
} else {
    // continue execution
}

还有很多其他帖子在解释这一点。

答案 1 :(得分:0)

我不确定,这是否有帮助。但是,如果您已到达文件末尾并且数组索引未达到15,则不打印先前插入的数组字符。

也许你的数组索引应该从0开始 - 直到计数。

这可能是正在显示垃圾字符的原因。

答案 2 :(得分:0)

^M是回车。打印时,光标返回最左侧的位置,但不会移动到下一行。第二批16个字符为f program^M Sp,因此在打印^M并返回回车后,Sp会覆盖先前的内容(即f pr)。