Страницы

Поиск по вопросам

среда, 25 декабря 2019 г.

При чтении файла реализовать перенос строки

#c #windows #файлы


Здравствуйте, необходимо при чтении файла реализовать перенос строки, т.е если длинна
строки превышает 60 символы то остальные символы должны быть перенесены на следующую
строку. (Строки должны храниться в массиве)

Исходный файл:

in.txt

char text[100][60],buffer[60];

void clear_buffer()
{
    for(int i=0;i<60;i++)
    {
        buffer[i]='\0';             // '/0'- пустой смвол
    }
}


Обращение к файлу:

FILE *in;
in=fopen("in.txt","r+");
int q=0;


Собственно, к задаче:

Первый вариант:

char ch;
int i=0,j=0;
while ((ch=fgetc(in))!=EOF)
{
    text[i][j]=ch;
    j++;
    if(ch=='\n'){j=0;i++;}
    if(j==59){text[i][j]='\n';i++;j=0;}
    printf("%c",ch);
}


Выглядит так:



Второй вариант:

for(int i=0;i<100;i++)
{
    fgets(buffer,60,in);

    if(buffer[strlen(buffer)-1]!='\0' and buffer[strlen(buffer)-1]!='\n')
    {


        for(int j=0;j<59;j++)
        {
            text[i][j]=buffer[j];
        }
        text[i][59]='\n';
        q++;
        fseek(in,ftell(in)-1,SEEK_SET);
    }
    else
    {
        for(int j=0;j<60;j++)
        {
            text[i][j]=buffer[j];
        }

    }

    clear_buffer();
    //printf("%s",text[i]);

}


Результат тот же, происходит некое дублирование....

Предложите пожалуйста Ваши варианты решения этой задачи, т.к у меня почему-то не
получается, по-разному пробовал.
    


Ответы

Ответ 1



Если вам просто нужно вывести на консоль текстовый файл посимвольно, таким образом, чтобы длина строки вывода не превышала 60 знаков, то вы можете сделать это следующим образом. Я надеюсь, что вам программу нужно написать на C++, а не на C. #include #include int main() { const size_t N = 60; std::ifstream in( "in.txt" ); char c; for ( size_t i = 0; in.get( c ); i %= N ) { if ( c == '\t' ) c = ' '; std::cout << c; if ( c == '\n' ) i = N; else if ( ++i == N ) std::cout << '\n'; } return 0; } В программе символы табуляции заменяются пробелами. Что касается, например, вашего первого фрагмента кода, то заполнение массива никак не связано с выводом на консоль. Предложение printf("%c",ch); у вас выполняется безусловно. Если же ваша задача совершенно иная.:) И на самом деле 1) вам надо написать программу на C, а не на C++ и 2) вам не надо посимвольно считывать файл, а нужно заполнить массив строками из файла, то программа может выглядеть следующим образом #include #include #define N 100 #define M 60 int main( void ) { // const size_t N = 100, M = 60; char text[N][M]; FILE *in; if ( ( in = fopen( "in.txt", "r" ) ) != NULL ) { char buffer[M]; size_t i = 0; int overflow = 0; while ( i < N && fgets( buffer + overflow, M - overflow, in ) ) { size_t n = strlen( buffer ); if ( n + 1 < M || buffer[n-1] == '\n' ) { overflow = 0; strcpy( text[i++], buffer ); } else { overflow = 1; char c = buffer[n-1]; buffer[n-1] = '\n'; strcpy( text[i++], buffer ); buffer[0] = c; } } } return 0; } Имейте в виду, что если затем вы будете выводить на консоль этот массив строк, то вам нужно будет заменить символы табуляции символами пробела.

Комментариев нет:

Отправить комментарий