Прочитать содержи мое файла и записать его в массив строк. Вывести строки на экран, убрав все комментарии
Задание: В файле хранится текст программы на языке С из произвольного количества строк (длина каждой строки не более 80 символов). Прочитать содержи мое файла и записать его в массив строк. Вывести строки на экран, убрав все комментарии. Организовать обработку ошибок и некорректного ввода.
Возникла проблема при разработке функции DeleteSlash. Я перепробовал много вариантов её написания, но всё бесполезно, помогите, пожалуйста!
Код:
#include <stdio.h>
#include <stdlib.h>
char ** OpenDataFile (char *filepath, int& n)
{
FILE *fp;
fp = fopen(filepath, "r");
if (!fp)
{
printf ("Error while openning file\n");
return NULL;
}
char buffer[81];
for(;fgets(buffer,81,fp); n++);
printf("count = %d",n);
char **arrayStr;
arrayStr = (char**)malloc(n*sizeof(char*));
for(int i=0; i<n; i++)
{
arrayStr[i] = (char*)malloc(81*sizeof(char));
}
fseek(fp, 0L, SEEK_SET);
for(int i=0; i<n; i++){
fgets(arrayStr[i],81,fp);
}
fclose(fp);
return arrayStr;
}
void DeleteSlash (char** arrayStrIn, int n)
{
char** arrayStrOut;
arrayStrOut = (char**)malloc(n*sizeof(char*));
for (int i = 0; i < n; i++)
{
arrayStrOut[i] = (char*)malloc(81*sizeof(char));
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < 81; j++)
{
while (!((arrayStrIn[i][j] == '/') && (arrayStrIn[i][j++] == '/'))) arrayStrOut[i][j] = arrayStrIn[i][j];
}
}
}
int WriteResultFile(char * filename, char** arrayStr, int n)
{
FILE *fp;
fp = fopen(filename, "w");
if (!fp)
{
printf ("Error while opennin file\n");
return -1;
}
for (int i=0; i<n; i++)
{
fputs(arrayStr[i], fp);
}
fclose(fp);
return 0;
}
int main()
{
char filepath[] = "LABTEXT.txt";
char filepath2[] = "text.txt";
int len=0;
char** text = OpenDataFile(filepath, len);
DeleteSlash (text, len);
WriteResultFile (filepath2, text, len);
return 0;
}
На данном этапе при запуске программы зависает консольное окно и в файл не выводится ничего. Пробовал и такой вариант:
void DeleteSlash (char** arrayStrIn, int n)
{
for (int i = 0; i < n; i++)
{
for (int j = 0; j < 81; j++)
{
if ((arrayStrIn[i][j] == '/') && (arrayStrIn[i][j++] == '/')) break;
arrayStrIn[i][j] = arrayStrIn[i][j];
}
}
}
В файле дан такой текст (содержимое файла LAB.txt):
#include <stdlib.h>
#include <stdio.h>
#include <math.h>
#include <string.h>
char * inputString (); //прототип функции
void outputString (char * );
int main () {
// вызов функции
char * str2 = inputString();
// DoSomething (str);
//реализуем функцию вывода строки на экран
outputString (str2);
return 0;
}
char * inputString () {
char * str; // объявление указателя
//c
str = (char *)malloc(250*sizeof(char)); //sizeof для того, чтобы на любом компе программа работала независимо от размерности типа char
// тут было выбелено 250 байт памяти
//free(str); // осовобождение неиспользованной памяти
scanf("%s", str);
//работа с указателями 1 вариант
for (int i=0; str[i]!='\0'; i++){
if (str[i]=='A') str[i]='H';
}
// работа с указателями правильная
for(int i=0; *(str+i)!='\0'; i++){
if (*(str+i)=='B') *(str+i)='_';
}
return str;
}
/* //c=++
char*str;
str+new char [250];
delete [] str; */
//реализуем функцию вывода строки на экран
void outputString (char*s){
printf ("%s", s);
}
Ответы (2 шт):
Автор решения: Sergey
→ Ссылка
Попробуйте так:
while (arrayStrIn[i][j]) { // Цикл до конца строки
if ( (arrayStrIn[i][j] == '/') && (arrayStrIn[i][j++] == '/'))) {
arrayStrOut[i][j] = '\0'; // Заканчиваем строку
break; // И завершаем цикл по строке
} else {
// Просто копируем символ
arrayStrOut[i][j] = arrayStrIn[i][j];
}
}
Автор решения: rareSteffe
→ Ссылка
Готовый код:
#include <stdio.h>
#include <stdlib.h>
char ** OpenDataFile (char *filepath, int& n)
{
FILE *fp;
fp = fopen(filepath, "r");
if (!fp)
{
printf ("Error while openning file\n");
return NULL;
}
char buffer[81];
for(;fgets(buffer,81,fp); n++);
printf("count = %d",n);
char **arrayStr;
arrayStr = (char**)malloc(n*sizeof(char*));
for(int i=0; i<n; i++)
{
arrayStr[i] = (char*)malloc(81*sizeof(char));
}
fseek(fp, 0L, SEEK_SET);
for(int i=0; i<n; i++){
fgets(arrayStr[i],81,fp);
}
fclose(fp);
return arrayStr;
}
void DeleteSlash (char** arrayStrIn, int n)
{
char** arrayStrOut;
arrayStrOut = (char**)malloc(n*sizeof(char*));
for (int i = 0; i < n; i++)
{
arrayStrOut[i] = (char*)malloc(81*sizeof(char));
}
for (int i = 0; i < n; i++)
{
for (int j = 0; arrayStrIn[i][j] != '\0'; j++)
{
if ( (arrayStrIn[i][j] == '/') && (arrayStrIn[i][j+1] == '/') )
{
arrayStrIn[i][j] = '\0';
break;
}
else
{
arrayStrOut[i][j] = arrayStrIn[i][j];
}
}
}
}
int WriteResultFile(char * filename, char** arrayStr, int n)
{
FILE *fp;
fp = fopen(filename, "w");
if (!fp)
{
printf ("Error while opennin file\n");
return -1;
}
for (int i=0; i<n; i++)
{
fputs(arrayStr[i], fp);
}
fclose(fp);
return 0;
}
int main()
{
char filepath[] = "LABTEXT.txt";
char filepath2[] = "text.txt";
int len=0;
char** text = OpenDataFile(filepath, len);
DeleteSlash (text, len);
WriteResultFile (filepath2, text, len);
return 0;
}