Страница 1 из 2

Файловый вывод

Добавлено: 30 мар 2016, 09:11
Kazanove
есть файл в несколько строк.
как эти строки записать в массив

Re: Файловый вывод

Добавлено: 30 мар 2016, 12:03
Romeo
Что содержат строки файла? Могут быть нюансы.

Общий подход (на чистом С) следующий:

1. Открыть файл (fopen);
2. В цикле, пока файл не закончился (feof), прочитать данные (fscanf);
3. Закрыть файл (fclose).

Re: Файловый вывод

Добавлено: 30 мар 2016, 14:02
Kazanove
вы имели что то вроде этого

Код: Выделить всё

#include <stdio.h>

int main()
{
	char str[80];
	FILE * pFile;
	pFile = fopen("test.txt", "r");
	while (fscanf(pFile, "%s", str)!=EOF){
		printf("%s", str);
	}
	fclose(pFile);
	return 0;
}
только оно удаляет все пробелы и переводы строки
хотелось бы на выходе получить

Код: Выделить всё

char str[10][100];
для того что бы потом с этими данными можно было работать как с массивом

Re: Файловый вывод

Добавлено: 30 мар 2016, 14:13
WinMain
Вместо функции fscanf используй функцию fgets().
А при выводе на экран пиши printf("%s\n", str);

Re: Файловый вывод

Добавлено: 30 мар 2016, 14:40
Kazanove

Код: Выделить всё

#include <stdio.h>
#include <string.h>
void main(){
	FILE *fp;
	fp = fopen("test.txt", "r");
	char str[80];
	while (fgets(str, 80, fp) != NULL){
		printf("%s", str);
	}
	fclose(fp);
}
это форматировано выводит весь файл на экран
если массив str вызвать не цикла то в не храниться только последняя строчка из файла
а как теперь с массивом str можно работать в не цикла чтения из файла, просто еще раз читать его и выполнять какие либо действия?

Re: Файловый вывод

Добавлено: 30 мар 2016, 14:52
Romeo

Код: Выделить всё

char str[10][100];
for (int i = 0; (i < 10) && (fgets(str[i], 100, fp) != NULL); ++i){
   printf("%s", str[i]);
}

Re: Файловый вывод

Добавлено: 31 мар 2016, 21:36
Kazanove
спасибо .

Re: Файловый вывод

Добавлено: 07 апр 2016, 11:03
Kazanove
новая задача
есть файл в со строками. строки представляют собой структуру каждое поле я разделил сепаратором "|"
1234|safdasdf|sadfsda|333,00|2
1234|asdff|sadfasdf|3334,00|12
1233|qweerr|sadfsgad sadgsdfg|233,00|3244
12344|wqerasdfasdf|sadfasd asdf asdf adsf|123456,00|123
сам так придумал так хронить структуру в файле

нужно прочитать файл и записать данные в структуру
сама структура

Код: Выделить всё

static struct Library{
	char UDK[10];
	char FullName[25];
	char BookName[50];
	float cost;
	int quantity;
	bool bin;
};
вот функционал

Код: Выделить всё

FILE * pFile;
	struct Library book[countRow];
	char arr[countRow];
	char *istr;
	int i = 0;
	int j;
	if ((pFile = fopen("db.txt", "r")) == NULL){
		printf("Ошибка: невозможно открыть файл.");
		exit(0);
	}

	while ((arr[i] = fgetc(pFile)) != EOF) {
		if (arr[i] == '\n') {
			arr[i] = '\0';
			istr = strtok(arr, "|");
			j = 0;
			while (istr != NULL){
				switch (j){
				case 0:
					strcpy(book[i].UDK, istr);
					break;
				case 1:
					strcpy(book[i].FullName, istr);
					break;
				case 2:
					strcpy(book[i].BookName, istr);
					break;
				case 3:
					book[i].cost = atof(istr);
					break;
				case 4:book[i].quantity = atoi(istr);
					break;
				default:
					break;
				}
				istr = strtok(NULL, "|");
				j++;
			}
			printf("\n\n");
			i = 0;
			j = 0;
		}
		else i++;
	}
	arr[i] = '\0';
почему не происходит записи в структуру?

Re: Файловый вывод

Добавлено: 07 апр 2016, 11:39
Romeo
Kazanove писал(а):хронить
OMG...
Kazanove писал(а):почему не происходит записи в структуру?
Наверное потому, что переменная i у тебя используется как для индекса в массиве строк, так и для индекса в массиве структур. Если её зануление для первого случая логично, то для второго случая - это катастрофа.

А можно встречный вопрос? В чём преимущество чтения по символам? Можно ведь было читать всю строку, как это было сделано в предыдущем примере, а потом уже дробить её на части с помощью strtok.

Ещё дам очень ценный совет. Научись пользоваться отладчиком. Это сразу же снимет все вопросы типа "а почему оно работает не так, как я хочу". Сэкономишь время как себе, так и нам. Себе на том, что не будешь ломать голову, а нам на том, что мы не будем разбирать код с достаточно глупыми ошибками.

Re: Файловый вывод

Добавлено: 07 апр 2016, 12:33
Decoder
Поспешил я отправить сообщение, можно его удалить...