Задать вопрос
nkorobkov
@nkorobkov

Как перевести курсор на новую строку при чтении из файла в СИ?

Я создаю текстовый файл в режиме "w" и записываю туда информацию.
Затем считываю её порциями в режиме "r":
считываю первую порцию (30 байт), записываю её в переменную. Перевожу курсор на 30 байт от начала файла, считываю вторую порцию (10 байт) и заношу в переменную, затем так же третью порцию (10 байт). После этого, данная строка символов в файле заканчивается, мне нужно перейти на следующую строку и считать всё точно такими же порциями. Как начать считывать следующую строку?

Вот код программы:
#include <stdio.h>
#include <stdlib.h>
#define N 30
#define R 10
#define K 2

struct STUDENT{
    char name[N];
    char group[R];
    char marks[R];
};

int main()
{
    /* Восьмеричный код "Возврат каретки"*/
    const char CR= '\015';
    /* Восьмеричный код "Перевод строки"*/
    const char LF = '\012';
    struct STUDENT students;
    int i;

    FILE *file;
    //Запись в файл
    file = fopen("structures.txt", "w");
    fprintf(file, "Korobkov N.V.");
    fseek(file, N, SEEK_SET);
    fprintf(file, "IST-151");
    fseek(file, N+R, SEEK_SET);
    fprintf(file, "5 3 4 5 1");
    fclose(file);
    //Чтение из файла
    file = fopen("structures.txt", "r");
    for (i = 0; i < N; i++){
        fscanf(file, "%c", &students.name[i]);
    }
    fseek(file, N, SEEK_SET); //Перевод курсора на 30 байт
    for (i = 0; i < R; i++){
        fscanf(file, "%c", &students.group[i]);
    }
    fseek(file, N+R, SEEK_SET); //Перевод курсора на 40 байт
    for (i = 0; i < R; i++){
        fscanf(file, "%c", &students.marks[i]);
    }
    fclose(file);
    //Вывод полей структуры на экран
    printf("%s\n", students.name);
    printf("%s\n", students.group);
    printf("%s\n", students.marks);
    return 0;
}
  • Вопрос задан
  • 9069 просмотров
Подписаться 2 Оценить 1 комментарий
Пригласить эксперта
Ответы на вопрос 3
Зачем вообще эти переводы курсоров? Можно просто использовать fread в режиме rb и считывать сразу в массив ? А запись производить с помощью фукции fwrite. fseek вообще не понимаю зачем нужен, если смещение само считается при записи.
Ответ написан
@abcd0x00
Прочитай какую-нибудь приличную книгу по C, ты неправильно используешь функции, неправильно используешь символы. То, что при компиляции ошибок не выдаёт, ещё не значит, что ошибок нет. В файле, открытом в текстовом режиме, нельзя смещаться на байтовую позицию, потому что в текстовом потоке все позиции неточные из-за допустимых неявных преобразований (некоторые символы могут удаляться/добавляться). То есть ошибку оно не выдаст, но результат будет неопределённым, вплоть до неизвестного мусора в массивах. Про CR LF я тебе уже написал - ты делаешь то, что уже сделано и встроено в язык. И символы эти уже встроены, и коды их точно так же можно получить в любой момент.
Ответ написан
Комментировать
NeiroNx
@NeiroNx
Программист
Конец строки 2 байта или 1 байт - просто переведиете курсор через него и будет следующая строка.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы