char readfile(int tstudent,FILE* filename)
...
char newString[20][20];
...
return newString;
Это не может быть хорошей вещью, верно? Вы определяете readFile
, чтобы возвращать один единственный символ (не указатель, только один байт), а затем возвращаете массив. Не стоит удивляться, что компилятор пожаловался.
Если вы «исправляете» переопределение возвращаемого типа, у вас все еще есть проблема, потому что newString
- это автоматическая локальная переменная. Хранилище (память), которое оно определяет, не определено вне функции.
Самый простой способ для функции заполнить структуру (или массив) в C - это передать вызывающей функции ее в качестве параметра функции. Таким образом, вы получите что-то вроде:
int readfile( FILE* input, char newString[][20], int tstudent )
где newString
определяется так же, как у вас, но вызывающей стороной, а не в файле чтения. Ср stdio функционирует как fgets
; большинство из них требуют от вызывающего абонента определить буфер, в который они читают.
Я просто укажу еще на несколько ошибок.
Каждый раз, когда вы вызываете функцию, особенно функцию ввода-вывода, проверяйте наличие ошибок. Вы можете прочитать tstudent
записей, но сколько их? Если вы попросите 5 и найдете только 1, что тогда? Ваш цикл чтения должен проверять конец файла, а readfile должен возвращать количество прочитанных записей, иначе вызывающий никогда не узнает. Сравните с тем, как работает fread (3). Эти парни из Unix знали кое-что о том, как определить функцию!
Теперь ваша функция выглядит примерно так:
int readfile( FILE* input, char newString[][20], int tstudent ) {
char line[100], *s;
int i=0;
for( ; i < tstudent && (s = fgets(line, sizeof(line), input)) != NULL; i++ ) {
/* do stuff with line */
}
/* check for EOF/error if s is NULL, and report */
return i;
}