Я ищу, чтобы найти эквивалентную функцию C FFC для C fgets. Я попытался получить функцию fstream, но не получил того, что хотел. Функция get не извлекает символ delim, а функция fgets используется для ее извлечения. Итак, я написал код для вставки этого символа delim из самого кода. Но это странное поведение. См. Мой примерный код ниже;C++ эквивалент C fgets
#include <stdio.h>
#include <fstream>
#include <iostream>
int main(int argc, char **argv)
{
char str[256];
int len = 10;
std::cout << "Using C fgets function" << std::endl;
FILE * file = fopen("C:\\cpp\\write.txt", "r");
if(file == NULL){
std::cout << " Error opening file" << std::endl;
}
int count = 0;
while(!feof(file)){
char *result = fgets(str, len, file);
std::cout << result << std::endl ;
count++;
}
std::cout << "\nCount = " << count << std::endl;
fclose(file);
std::fstream fp("C:\\cpp\\write.txt", std::ios_base::in);
int iter_count = 0;
while(!fp.eof() && iter_count < 10){
fp.get(str, len,'\n');
int count = fp.gcount();
std::cout << "\nCurrent Count = " << count << std::endl;
if(count == 0){
//only new line character encountered
//adding newline character
str[1] = '\0';
str[0] = '\n';
fp.ignore(1, '\n');
//std::cout << fp.get(); //ignore new line character from stream
}
else if(count != (len -1)){
//adding newline character
str[count + 1] = '\0';
str[count ] = '\n';
//std::cout << fp.get(); //ignore new line character from stream
fp.ignore(1, '\n');
//std::cout << "Adding new line \n";
}
std::cout << str << std::endl;
std::cout << " Stream State : Good: " << fp.good() << " Fail: " << fp.fail() << std::endl;
iter_count++;
}
std::cout << "\nCount = " << iter_count << std::endl;
fp.close();
return 0;
}
TXT файл, который я использую write.txt с следующим содержанием:
This is a new lines.
Now writing second
line
DONE
Если вы заметили мою программу, я использую fgets функционировать первый, а затем с помощью получить функцию в том же файле. В случае функции get состояние потока ухудшается.
Может ли кто-нибудь указать мне, что здесь происходит не так?
ОБНОВЛЕНО: теперь я отправляю простейший код, который не работает на моем конце. Если я не забочусь о DELIM характера сейчас и просто читать весь файл, 10 символов в то время, используя GetLine:
void read_file_getline_no_insert(){
char str[256];
int len =10;
std::cout << "\nREAD_GETLINE_NO_INSERT FUNCITON\n" << std::endl;
std::fstream fp("C:\\cpp\\write.txt", std::ios_base::in);
int iter_count = 0;
while(!fp.eof() && iter_count < 10){
fp.getline(str, len,'\n');
int count = fp.gcount();
std::cout << "\nCurrent Count = " << count << std::endl;
std::cout << str << std::endl;
std::cout << " Stream State : Good: " << fp.good() << " Fail: " << fp.fail() << std::endl;
iter_count++;
}
std::cout << "\nCount = " << iter_count << std::endl;
fp.close();
}
int main(int argc, char **argv)
{
read_file_getline_no_insert();
return 0;
}
Если дите увидеть результат выше кода:
READ_GETLINE_NO_INSERT FUNCITON
Current Count = 9
This is a
Stream State : Good: 0 Fail: 1
Current Count = 0
Stream State : Good: 0 Fail: 1
Вы бы видели что состояние потока идет «Плохо», и бит отказа установлен. Я не понимаю этого поведения.
Rgds Sapan
Возможно, вы ищете ['getline'] (http://en.cppreference.com/w/cpp/string/basic_string/getline) –
Существует также [' getline'] (http: // ru. cppreference.com/w/cpp/io/basic_istream/getline), который является более буквальным аналогом 'fgets', но вам, вероятно, нужен тот, который указан в приведенном выше комментарии, поскольку работа с' string 'обычно лучше, чем с 'char'. – Hurkyl
@IgorTandetnik: Вопрос совершенно ясен, что символ разделителя должен быть сохранен, а 'getline' этого не делает. –