代码的作用:我读了一个二进制文件并对其进行排序。我使用频率数组来做到这一点。 更新:它确实做了循环,但它没有正确地写出数字......
这就是代码。我想在阅读后写上文件。我会写一下已经写好的东西,那就好了。问题是我在编译时没有错误,但在运行时似乎我有一个无限循环。 该文件是二进制文件。我逐字节地读它,这也是我想写它的方式。
while(fread(readChar, sizeof(readChar)/2, 1, inFile)){
bit = atoi(readChar);
array[bit] = array[bit] + 1;
}
fseek(inFile, 0, SEEK_SET);
for( i = 0; i < 256; i++)
while(array[i] > 0){
writeChar[0] = array[i]; //do I correctly convert int to char?
fwite(writeChar, sizeof(readChar)/2, 1, inFile);
array[i] = array[i] -1;
}
inFile文件声明是:
FILE* inFile = fopen (readFile, "rb+");
它从文件中读取,但不写入!
答案 0 :(得分:0)
我看到无限循环的唯一可能原因是,您的数组未初始化。
声明后:
int array[256];
元素可以包含任何整数值,也可以是非常大的整数值
所以没有无限循环,但是一些循环可以有很多迭代
您应该用零初始化数组:
int array[256]={0};
我不知道数组中元素的数量,如果这是你声明它的方式,但如果你声明你的数组如图所示,那么={0}
会将所有成员初始化为0。也可以使用循环:
for(int i=0; i < COUNT_OF_ELEMENTS;i++) array[i] = 0;
编辑:我忘了提及,你的代码只能对只有数字的文件进行排序。
为此,您还必须在写作时更改conversion
:
char writeChar[2]={0};
for( int i = 0; i < 256; i++)
while(array[i] > 0){
_itoa(i,writeChar,10);
fwrite(writeChar, sizeof(char), 1, inFile);
array[i] = array[i] -1;
}
之前的文件内容:
12345735280735612385478504873457835489
文件内容:
00112223333334444455555556777778888889
这就是你想要的吗?
答案 1 :(得分:0)
未定义的行为:
fread()
用于读取二进制数据表示。 atoi()
采用文本数据表示:字符串(指向以char
终止的'\0'
数组的指针。
除非读入readChar
的数据的某个字节设置为0,否则调用atoi()
可能会访问readChar
以外的数据。
fread(readChar, sizeof(readChar)/2, 1, inFile);
bit = atoi(readChar);
编码它不是“逐位”读取数据在@Jens注释:“最小的单位是一个字节。”这至少是8位。