Как прочитать несколько строк из текста и написать в другой ? C

#c #file #char #readfile #writefile

Вопрос:

Таким образом, в принципе, я должен читать из текстового файла, используя C , несколько строк. Затем мне нужно посчитать голоса в каждой строке, и число, которое даже указывает мне записать строку в другой текстовый файл. Но у меня есть проблема с манипуляциями :

 void voals_text() {  FILE *input_file;  FILE *output_file;  char input_line[1024];  char output_line[1024];  input_file = fopen("questions.txt", "r");  output_file = fopen("result.txt", "a ");  char line[1024];  int nr_voals=0;  while(fgets(line, 1024, input_file))  {  for(int i=0;ilt;1024;i  )  {  if(line[i]gt;=33 amp;amp; line[i]lt;=126)  {  coutlt;lt;line[i];  if(line[i]=='a' || line[i]=='e' || line[i]=='i' || line[i]=='o' || line[i]=='u')  {  nr_voals  ;  }  }  }   if(nr_voals%2==0)  {  fputs(line, output_file);  }  nr_voals=0;   }   fclose(input_file);  fclose(output_file); }    int main() {  voals_text();  return 0; }    

Проблема в чтении. Я должен поместить всю строку в символ. Но я заранее не знаю длину линии, поэтому предполагаю, что она имеет ширину не более 1024. Но если он меньше, то неиспользуемые биты заполняются странными символами. Когда я повторяю, чтобы увидеть, содержит ли моя строка четное количество нулей или нет, мой счетчик тоже подсчитывает странные символы, и я получаю очень, очень странные результаты. Может кто-нибудь объяснить мне, почему? А также, как я должен читать и записывать файлы более умным способом? (без использования ifstream и fstream). Большое спасибо!

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

1. использовать std::string и std::stream

2. Проверьте длину строки с помощью strlen() и просто повторите до этого числа. В настоящее время вы читаете после символа, заканчивающегося нулем, в каждой строке. Или проверьте наличие нулевого символа, а затем прервитесь, если вы его нажмете. Напр if(line[i] == ‘’) break; .. Но на самом деле это код на C, а не на C .

3. Не работайте с буферами вручную. Позвольте классам стандартной библиотеки C сделать это за вас автоматически. Создайте объект std::ifstream и считайте данные в std::векторlt;std::строкаgt; с помощью std::getline. После этого выполните итерацию через std::векторlt;std::строкаgt; для обработки данных.

4. @maksim_volodin это был мой первый подход, но мой профессор хочет использовать этот трудный путь. Немного странно, что я должен писать этот код, на трудном пути, например, без использования некоторых предопределенных библиотек. Но спасибо тебе !

5. @DS_London Спасибо тебе! Я об этом не подумал! Я постараюсь! Большое спасибо!!!!!