Неясно, сколько int
в вашем файле, и текущий способ их хранения подвержен ошибкам.fgetc
возвращает int
, который либо EOF
(-1), либо 0-255, поэтому ch
должен был быть объявлен int
, а затем, когда (ch=getc(fp))!= EOF
равно true, ch
будет содержать 0-255.В следующем fscanf(fp, "%d", &a[ch]);
вы снова читаете из файла, но в массив в позиции индекса ch
, что явно не является вашим намерением (и, вероятно, также произойдет сбой при чтении символа со значением> 9. Подсказка: «0» имеет значение 48).Приведенное ниже решение может показаться слишком сложным, но я привык к C ++, где все это происходит под капотом, и вам не нужно об этом беспокоиться.Возможно, вы получите некоторые идеи, назвав это.
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
/* dynamic memory storage - start */
typedef struct {
size_t m_size;
size_t m_reserved;
int* m_data;
} store;
/* create a store */
store* store_create() {
store* s = malloc(sizeof(store));
if(s) {
/* initialize values */
s->m_size = 0;
s->m_reserved = 1; /* a very conservative start value */
s->m_data = malloc(sizeof(int)*s->m_reserved);
if(s->m_data==NULL) {
free(s);
s = NULL;
}
}
return s;
}
/* destroy a store */
void store_destroy(store* s) {
/* free the integer array */
free(s->m_data);
/* free the store struct */
free(s);
}
bool store_reserve(store* s, size_t new_res) {
/* reserve more space for the int's if needed */
if(new_res>s->m_reserved) {
int* n = realloc(s->m_data, sizeof(int)*new_res);
if(n==NULL) return false; /* could not expand storage */
s->m_reserved = new_res;
s->m_data = n;
}
return true;
}
// check if it's time to increase reserved storage
bool store_check_reserve(store* s) {
if(s->m_size == s->m_reserved)
/* change 5/4 to a larger value for more aggressive
* increase of memory allocation */
return store_reserve(s, (s->m_reserved+1)*5/4);
else
return true;
}
// add a value to the store
bool store_add(store* s, int v) {
if(!store_check_reserve(s)) return false;
s->m_data[s->m_size++] = v;
return true;
}
/* dynamic memory storage - end */
int main(int argc, char* argv[]) {
FILE* fp;
fp = fopen("file.txt", "r");
/* create a store for our unknown amount of int's */
store* myStore = store_create();
/* scan for strings separated by comma and newline
* and allocate memory for it */
char* str;
while(fscanf(fp, " %m[^,\n],", &str)==1)
{
int num;
/* convert string to integer */
if(sscanf(str, "%d", &num)==1) {
/* store the extracted value */
if(store_add(myStore, num)==false) {
fprintf(stderr, "FAILED STORING %d\n", num);
}
}
// free string allocated by fscanf (%m) */
free(str);
}
fclose(fp);
printf("All %d stored values:\n", myStore->m_size);
for(size_t i=0; i<myStore->m_size; ++i) {
printf("%d = %d\n", i, myStore->m_data[i]);
}
/* release memory allocated by our store */
store_destroy(myStore);
return 0;
}