Файловый вывод
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
есть файл в несколько строк.
как эти строки записать в массив
как эти строки записать в массив
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Что содержат строки файла? Могут быть нюансы.
Общий подход (на чистом С) следующий:
1. Открыть файл (fopen);
2. В цикле, пока файл не закончился (feof), прочитать данные (fscanf);
3. Закрыть файл (fclose).
Общий подход (на чистом С) следующий:
1. Открыть файл (fopen);
2. В цикле, пока файл не закончился (feof), прочитать данные (fscanf);
3. Закрыть файл (fclose).
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
вы имели что то вроде этого
только оно удаляет все пробелы и переводы строки
хотелось бы на выходе получить
для того что бы потом с этими данными можно было работать как с массивом
Код: Выделить всё
#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];
Вместо функции fscanf используй функцию fgets().
А при выводе на экран пиши printf("%s\n", str);
А при выводе на экран пиши printf("%s\n", str);
Код: Выделить всё
#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 можно работать в не цикла чтения из файла, просто еще раз читать его и выполнять какие либо действия?
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Код: Выделить всё
char str[10][100];
for (int i = 0; (i < 10) && (fgets(str[i], 100, fp) != NULL); ++i){
printf("%s", str[i]);
}
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
новая задача
есть файл в со строками. строки представляют собой структуру каждое поле я разделил сепаратором "|"
нужно прочитать файл и записать данные в структуру
сама структура
вот функционал
почему не происходит записи в структуру?
есть файл в со строками. строки представляют собой структуру каждое поле я разделил сепаратором "|"
сам так придумал так хронить структуру в файле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';
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
OMG...Kazanove писал(а):хронить
Наверное потому, что переменная i у тебя используется как для индекса в массиве строк, так и для индекса в массиве структур. Если её зануление для первого случая логично, то для второго случая - это катастрофа.Kazanove писал(а):почему не происходит записи в структуру?
А можно встречный вопрос? В чём преимущество чтения по символам? Можно ведь было читать всю строку, как это было сделано в предыдущем примере, а потом уже дробить её на части с помощью strtok.
Ещё дам очень ценный совет. Научись пользоваться отладчиком. Это сразу же снимет все вопросы типа "а почему оно работает не так, как я хочу". Сэкономишь время как себе, так и нам. Себе на том, что не будешь ломать голову, а нам на том, что мы не будем разбирать код с достаточно глупыми ошибками.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Поспешил я отправить сообщение, можно его удалить...
Поумнеть несложно, куда труднее от дури избавиться.