C for 循环打印不正确,字符乱序
C for loop not printing correctly, characters out of order
编辑:我现在意识到我需要问的问题是我将如何捕捉 dat 文件“^M”中的马车 returns 抛出我的输出,如下所示。
我的程序从文件中读取字符,将它们放入一个数组中,一旦数组已满,它就会转储输入。该文件包含我猜测可能导致问题的特殊字符。我正在读取字符,然后以十六进制格式打印它们的数值,然后在下一行我想以字符形式打印相同的信息。
谁能告诉我为什么我的 for
循环似乎跳来跳去?数组是否加载不正确?
file.dat 文件 -- 在
之后包含制表符
This is a test of program^M
Special characters are: ^L ^H ^K
OUTPUT: -- 输出格式为 %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
十六进制格式的输出是正确的,翻译后就是我想要和需要的输出
OUTPUT: -- 输出错误无序
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
循环是如何导致此输出的。
代码:
#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)
{}
我不确定这是否有帮助。但是在你已经到达文件末尾并且数组索引没有达到15的情况下,你是不是打印了数组之前插入的字符。
也许您的数组索引应该从 0 到计数。
这可能是显示垃圾字符的原因。
while(!eof) 是错误的
在调用 feof() 之前,始终需要检查读取的 return 值(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
}
还有很多其他帖子对此进行了解释。
^M
是马车return。打印时,光标 returns 到最左边,但不会移动到下一行。第二批16个字符是f program^M Sp
,所以在打印^M
并回车return后,Sp
覆盖了之前的内容(即f pr
)。
编辑:我现在意识到我需要问的问题是我将如何捕捉 dat 文件“^M”中的马车 returns 抛出我的输出,如下所示。
我的程序从文件中读取字符,将它们放入一个数组中,一旦数组已满,它就会转储输入。该文件包含我猜测可能导致问题的特殊字符。我正在读取字符,然后以十六进制格式打印它们的数值,然后在下一行我想以字符形式打印相同的信息。
谁能告诉我为什么我的 for
循环似乎跳来跳去?数组是否加载不正确?
file.dat 文件 -- 在
之后包含制表符This is a test of program^M
Special characters are: ^L ^H ^K
OUTPUT: -- 输出格式为 %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
十六进制格式的输出是正确的,翻译后就是我想要和需要的输出
OUTPUT: -- 输出错误无序
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
循环是如何导致此输出的。
代码:
#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)
{}
我不确定这是否有帮助。但是在你已经到达文件末尾并且数组索引没有达到15的情况下,你是不是打印了数组之前插入的字符。
也许您的数组索引应该从 0 到计数。
这可能是显示垃圾字符的原因。
while(!eof) 是错误的
在调用 feof() 之前,始终需要检查读取的 return 值(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
}
还有很多其他帖子对此进行了解释。
^M
是马车return。打印时,光标 returns 到最左边,但不会移动到下一行。第二批16个字符是f program^M Sp
,所以在打印^M
并回车return后,Sp
覆盖了之前的内容(即f pr
)。