2015-03-07 2 views
0

Я ищу, чтобы найти эквивалентную функцию 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

+3

Возможно, вы ищете ['getline'] (http://en.cppreference.com/w/cpp/string/basic_string/getline) –

+0

Существует также [' getline'] (http: // ru. cppreference.com/w/cpp/io/basic_istream/getline), который является более буквальным аналогом 'fgets', но вам, вероятно, нужен тот, который указан в приведенном выше комментарии, поскольку работа с' string 'обычно лучше, чем с 'char'. – Hurkyl

+0

@IgorTandetnik: Вопрос совершенно ясен, что символ разделителя должен быть сохранен, а 'getline' этого не делает. –

ответ

6

std::getline() прочтет строку из потока, пока он не встречает разделитель (символ новой строки по умолчанию).

В отличие от fgets(), std :: getline() отбрасывает разделитель. Но, в отличие от fgets(), он будет читать всю строку (доступная память), поскольку она работает с std::string, а не с char *. Это делает его несколько проще использовать на практике.

Все типы, полученные из std::istream (который является базовым классом для всех входных потоков) также имеют функцию-член, называемый getline(), который работает немного больше, как fgets() - прием и на размер буфера char *. Тем не менее он все же отбрасывает разделитель.

Специфичные для C++ параметры - это перегруженные функции (т. Е. Доступны более чем в одной версии), поэтому вам нужно прочитать документацию, чтобы решить, какой из них соответствует вашим потребностям.