#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 Спасибо тебе! Я об этом не подумал! Я постараюсь! Большое спасибо!!!!!