#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; } Имейте в виду, что если затем вы будете выводить на консоль этот массив строк, то вам нужно будет заменить символы табуляции символами пробела.
Комментариев нет:
Отправить комментарий