fseek在运行时创建无限循环

时间:2015-01-15 09:16:02

标签: c shell ubuntu binaryfiles fseek

代码的作用:我读了一个二进制文件并对其进行排序。我使用频率数组来做到这一点。 更新:它确实做了循环,但它没有正确地写出数字......

这就是代码。我想在阅读后写上文件。我会写一下已经写好的东西,那就好了。问题是我在编译时没有错误,但在运行时似乎我有一个无限循环。 该文件是二进制文件。我逐字节地读它,这也是我想写它的方式。

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+");

它从文件中读取,但不写入!

2 个答案:

答案 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位。