C, чтение многострочного текстового файла - PullRequest
2 голосов
/ 29 апреля 2011

Я знаю, что это глупый вопрос, но как мне загрузить данные из многострочного текстового файла?

while (!feof(in)) {
    fscanf(in,"%s %s %s \n",string1,string2,string3);
}

^^ Вот как я загружаю данные из одной строки, и все работает нормально. Я просто понятия не имею, как загрузить те же данные из второй и третьей строк.

Опять же, я понимаю, что это, вероятно, глупый вопрос.

Редактировать: проблема не решена. Я понятия не имею, как читать текст из файла, который находится не в первой строке. Как бы я это сделал? Извините за глупый вопрос.

Ответы [ 5 ]

4 голосов
/ 29 апреля 2011

Попробуйте что-то вроде:

/ отредактировано /

char line[512]; // or however large you think these lines will be

in = fopen ("multilinefile.txt", "rt");  /* open the file for reading */
/* "rt" means open the file for reading text */
int cur_line = 0;
while(fgets(line, 512, in) != NULL) {
     if (cur_line == 2) { // 3rd line
     /* get a line, up to 512 chars from in.  done if NULL */
     sscanf (line, "%s %s %s \n",string1,string2,string3);
     // now you should store or manipulate those strings

     break;
     }
     cur_line++;
} 
fclose(in);  /* close the file */

или, возможно, даже ...

char line[512];
in = fopen ("multilinefile.txt", "rt");  /* open the file for reading */
fgets(line, 512, in); // throw out line one

fgets(line, 512, in); // on line 2
sscanf (line, "%s %s %s \n",string1,string2,string3); // line 2 is loaded into 'line'
// do stuff with line 2

fgets(line, 512, in); // on line 3
sscanf (line, "%s %s %s \n",string1,string2,string3); // line 3 is loaded into 'line'
// do stuff with line 3

fclose(in); // close file
3 голосов
/ 29 апреля 2011

Помещение \n в строку формата scanf не отличается от пробела.Вы должны использовать fgets для получения строки, а затем sscanf для самой строки.

Это также упрощает восстановление после ошибок.Если бы это был только вопрос соответствия новой строки, вы могли бы использовать "%*[ \t]%*1[\n]" вместо " \n" в конце строки.Вам, вероятно, следует использовать %*[ \t] вместо всех ваших пробелов в этом случае и проверить возвращаемое значение из fscanf.Использование fscanf непосредственно при вводе очень трудно понять правильно (что произойдет, если в строке четыре слова? Что произойдет, если их всего два?), И я бы порекомендовал решение fgets / sscanf.как упоминал Делан Азабани ... из этого фрагмента не ясно, делаете ли вы это еще не так, но вы должны либо определить пространство [например, в большом массиве или какой-либо динамической структуре с malloc] для хранения всего набора данных, либовся ваша обработка внутри цикла.

Вы также должны указать, сколько места доступно для каждой строки в спецификаторе формата.%s сам по себе в scanf всегда является ошибкой и может быть уязвимостью безопасности.

2 голосов
/ 29 апреля 2011

Во-первых, вы не используете feof() вот так ... он показывает вероятный фон Паскаля, либо в вашем прошлом, либо в прошлом вашего учителя.

Для чтения строк лучше всего использовать POSIX 2008 (Linux) getline() или стандартную C fgets(). В любом случае, вы пытаетесь прочитать строку с помощью функции и останавливаетесь, когда она указывает EOF:

while (fgets(buffer, sizeof(buffer), fp) != 0)
{
     ...use the line of data in buffer...
}

char *bufptr = 0;
size_t buflen = 0;
while (getline(&bufptr, &buflen, fp) != -1)
{
    ...use the line of data in bufptr...
}
free(bufptr);

Чтобы прочитать несколько строк, вам нужно решить, нужны ли вам также предыдущие строки. Если нет, то подойдет одна строка (массив символов). Если вам нужны предыдущие строки, вам нужно прочитать массив, возможно, массив динамически размещаемых указателей.

1 голос
/ 29 апреля 2011

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

0 голосов
/ 27 марта 2013

У меня есть еще более простое решение без каких-либо запутанных фрагментов головоломных методов (без оскорблений вышеизложенного), вот оно:

#include <iostream>
#include <fstream>
#include <string>

using namespace std;
int main()
{
    string line;//read the line
    ifstream myfile ("MainMenu.txt"); // make sure to put this inside the project folder with all your .h and .cpp files

    if (myfile.is_open())
    {
        while ( myfile.good() )
        {
            getline (myfile,line);
            cout << line << endl;
        }
        myfile.close();
           }
    else cout << "Unable to open file";
   return 0;

}

Счастливое кодирование

...