2012-07-10 120 views
1

我有这段代码从文件中读取整数。 我使用相同的代码从另一个文件 读取双打,并完美地工作,但这次循环是 变得无限。可能是什么?我正在阅读的文件 是由程序编写的,可以吗?我不知道 这是什么意思,但我的操作系统说这个文件是 二进制。那么,任何帮助将不胜感激。谢谢。在C中读取文件

i=1; 
cadeia = malloc (i * sizeof(int)); 
if (!cadeia){ //Avalia se a alocação de memória foi bem sucedida 
    printf("Problema na alocação de memória para cadeia."); 
    exit(0); 
} 
while (!feof(arq_cadeia)){ /*Fazendo leitura e alocação de memória da matriz de transição*/ 
    fscanf (arq_cadeia , "%d" , (cadeia+i-1)); 
    i++; 
    cadeia = realloc (cadeia , i * sizeof(int)); 
    if (!cadeia){ //Avalia se a alocação de memória foi bem sucedida 
    printf("Problema na alocação de memória para cadeia."); 
    exit(0); 
    } 
    printf("%d\n", *(cadeia+i-1)); 
} 
+1

您需要检查'fscanf'的结果并确保它等于1. – 2012-07-10 15:38:26

+4

关于'while(!feof(arq_cadeia))',请注意,'feof'只会变为true _after_您尝试读取文件结尾。在循环中,检查'fscanf'的返回值,如果遇到无效输入,则保留在流中,并且所有后续扫描都失败。 – 2012-07-10 15:38:55

+0

这里与你的问题无关,但你应该考虑以更大的增量分配你的缓冲区,预分配一个块,如果你需要更多的话,然后在块中做一个realloc。 – pstrjds 2012-07-10 15:39:13

回答

2

你的预感是正确的,如果你的文件是二进制格式scanf无法读取它。如果使用文本编辑器(例如记事本)无法看到数字,scanf也无法读取它们。

顺便说一下,你的程序有其他问题:每次读取数字时,重新分配整个数组效果非常低效!最简单的事情就是分配太多的空间以至于你不需要所有的空间(不要担心“浪费”,只要你没有超越顶端)。第二个最简单的方法是测量文件的大小(你需要stat或其他的),并估计它的整数。第三种最简单的方法是,为10000个整数分配足够的空间,然后仔细检查你什么时候用完,分配的次数是你已有的两倍。

+0

非常好!非常感谢您的帮助。 – Rodolfo 2012-07-10 16:21:08

0

假设它们是以文本模式编写的,您正在阅读整数。如您怀疑的那样,检查文件是否是文本文件或是否是二进制文件。如果你可以用文本编辑器打开它并阅读内容,那么它是一个文本文件。否则,您需要调整程序以读取二进制文件。

+0

正如我在评论中所说:所有文件都是二进制文件。访问模式有什么变化,而不是文件。 – m0skit0 2012-07-10 15:42:13

+0

不错,谢谢! – Rodolfo 2012-07-10 16:21:20