2014-02-14 2 views
-1

Мне нужно прочитать текстовый файл по строкам.Прочтите файл txt по строке, не используя fopen()

Проблема заключается в том, что в моем коде я не могу использовать fopen(), а затем fgets() прочитать содержимое каждой строки, потому что fopen() терпит неудачу, когда я использую много потоков (кажется, что он получает от перегрузки, так как он открытая компании так много раз).

+1

Используйте 'open()' и 'read()'? – alk

+3

Что вы подразумеваете под "can not"? Говорит кто? – unwind

+0

Но как я могу перейти к следующей строке, используя read? функция чтения считывает все символы вдоль, но без изменения строки. – cuartango

ответ

0

Вы можете использовать getline() Вам нужно будет указать разделитель и некоторое время или цикл, чтобы остановить, когда достигнете EOF.

EDIT: Вы сказали, что вы не хотите использовать FOPEN() и fgets() и так:

#include <iostream> 
#include <fstream> 
#include <string> 
using namespace std; 

int main() { 
    string line; 
    ifstream myfile ("example.txt"); 
    if (myfile.is_open()) 
    { 
    while (! myfile.eof()) 
    { 
     getline (myfile,line); 
    if (line = something) 
     { 
     // read next line and print it... but how? 
     } 
    myfile.close(); 
    } 

    else cout << "Unable to open file"; 

    return 0; 
} 
+0

Я сомневаюсь, что вызов 'getline()', не вызвав 'fopen()' в 'FILE *', будет работать. – alk

+0

Я не могу использовать fopen (проблемы с резьбой). Возможно, я могу использовать поток. – cuartango

+1

@cuartango: 'ofstream' является C++, он недоступен в C. – alk

0

Большинство операционных систем имеют ограничения на сколько файлов конкретный процесс может открыть одновременно. Поскольку fopen() является «просто» оболочкой поверх open(), это не поможет использовать интерфейс нижнего уровня, если это ваша проблема.

Вы можете убедиться, что это действительно ваша проблема, проверив errno, когда fopen() сбой, т. Е. Если он возвращает NULL. Вы звучите так, как будто вы уже это сделали, но вы не очень конкретны. Я ожидал бы EMFILE, если вы столкнулись с лимитом каждого процесса (см. open() manual page).

Вам необходимо выяснить, каковы ваши конкретные ограничения и посмотреть, можете ли вы их изменить или перепроектировать, чтобы вы не открывали столько файлов параллельно.

+0

. После многих исследований мы обнаружили, что Fopen не работает, когда он используется столько раз (из-за многопоточности). Я уже изменил fopen, чтобы открыть в бинарных файлах чтение, теперь проблема заключается в том, чтобы не читать двоичные файлы с открытым. – cuartango

+0

@cuartango: "* так много раз *": ** Как ** много раз пожалуйста? – alk

+0

один раз за поток, и он терпит неудачу, когда я использую более 4 потоков. Дело в том, что fopen, похоже, перегружается при использовании его много раз при открытии и разных файлов. – cuartango

0

Вы можете использовать открытые (man open (2)) и читать (man read(2)).

В чем проблема с fopen()?

+0

Я не понимаю, что открыто (человек открыт (2))? – cuartango

+0

@cuartango, какую ОС вы используете, Windows, Linux или OS X? (Я думаю, это не BSD) – nodakai

+0

@nodakai Windows 7 – cuartango

0

Если функции open/read и fopen/fread не работают, возможно, это связано с тем, что у вас заканчиваются блокировки. Использование unlocked_getc в цикле (чтение до получения новой строки) может быть самым простым вариантом.

0

Некоторые люди рекомендовали использовать open(2) и read(2) в качестве заменителей fopen(3) и fgets(3), но так как они являются Unix (Linux и OS X) API, вы не можете использовать их с Borland на Windows. Что соответствует open(2) и read(2) на Windows, являются Win32 API, CreateFile и ReadFile

Но я очень сомневаюсь, что это путь для вас ... Вы пытаетесь для решения проблемы, которая никогда не должна происходить в обычной программе. Вам нужно найти основную причину вашей проблемы.

Смежные вопросы