Как найти позицию символа в файле

0 / 0 / 0

Регистрация: 21.12.2015

Сообщений: 17

1

Поиск символа в текстовом файле

18.05.2016, 19:57. Показов 6499. Ответов 14


Студворк — интернет-сервис помощи студентам

Как можно организовать поиск введенного символа в txt файле?



0



1505 / 968 / 812

Регистрация: 30.04.2016

Сообщений: 3,334

18.05.2016, 20:24

2

lllenium, что именно вам нужно? Сколько раз встречается заданный символ? Или нужно заменить один символ на другой. Может быть, что-то еще?



0



0 / 0 / 0

Регистрация: 21.12.2015

Сообщений: 17

19.05.2016, 10:37

 [ТС]

3

Нужно найти этот символ, и ту строку где он находится перенести в конец txt файла.



0



Fixer_84

1505 / 968 / 812

Регистрация: 30.04.2016

Сообщений: 3,334

19.05.2016, 21:42

4

Лучший ответ Сообщение было отмечено lllenium как решение

Решение

lllenium, смотрите код ниже. Я ищу ту строчку, в которой этот символ встречается впервые.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include <iostream>
#include <cmath>
#include <fstream>
 
using namespace std;
 
int main()
{
    ifstream fin("input.txt");
    ofstream fout("output.txt");
    int k, p, min;
    string a, b;
    k = 0;
    min = 100;
    while(getline(fin, a))
    {
        for (int i = 0; i < a.length(); i++)
        {
            if (a[i] == '*') //Здесь ваш символ
            {
                p = k;
                if (p <= min) 
                {
                    min = p;
                    b = a;
                }
                break;
            }
        }
        fout << a << endl;
        k++;
    }
    fout << b << endl;
    fin.close();
    fout.close();
    system("pause"); 
    return 0;   
}



1



0 / 0 / 0

Регистрация: 21.12.2015

Сообщений: 17

19.05.2016, 21:54

 [ТС]

5

Спасибо большое А как сделать, чтобы пользователь при запуске программы сам вводил искомый символ?



0



Fixer_84

1505 / 968 / 812

Регистрация: 30.04.2016

Сообщений: 3,334

19.05.2016, 22:29

6

lllenium, ниже код с учетом ваших пожеланий.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#include <iostream>
#include <cmath>
#include <string>
#include <fstream>
 
using namespace std;
 
int main()
{
    ifstream fin("input.txt");
    ofstream fout("output.txt");
    int k, p, min;
    string a, b;
    char sym;
    cout << "Введите искомый символ: ";
    cin >> sym;
    k = 0;
    min = 100; //Здесь максимальное число строк файла
    while (getline(fin, a))
    {
        for (int i = 0; i < a.length(); i++)
        {
            if (a[i] == sym) //Здесь ваш символ
            {
                p = k;
                if (p <= min) 
                {
                    min = p;
                    b = a;
                }
                break;
            }
        }
        fout << a << endl;
        k++;
    }
    fout << b << endl;
    fin.close();
    fout.close();
    system("pause"); 
    return 0;   
}



1



0 / 0 / 0

Регистрация: 21.12.2015

Сообщений: 17

21.05.2016, 13:48

 [ТС]

7

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



0



Fixer_84

1505 / 968 / 812

Регистрация: 30.04.2016

Сообщений: 3,334

21.05.2016, 14:49

8

Лучший ответ Сообщение было отмечено lllenium как решение

Решение

lllenium, ниже ответ на ваш вопрос.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <cmath>
#include <string>
#include <fstream>
 
using namespace std;
 
int main()
{
    ifstream fin("input.txt");
    ofstream fout("output.txt");
    int k, p, min, N;
    string a, b;
    char sym;
    cout << "Введите искомый символ: ";
    cin >> sym;
    cout << "Сколько раз перенести строку: ";
    cin >> N;
    k = 0;
    min = 100; 
    while (getline(fin, a))
    {
        for (int i = 0; i < a.length(); i++)
        {
            if (a[i] == sym) 
            {
                p = k;
                if (p <= min) 
                {
                    min = p;
                    b = a;
                }
                break;
            }
        }
        fout << a << endl;
        k++;
    }
    for (int i = 0; i < N; i++)
    {
    fout << b << endl;
    }
    fin.close();
    fout.close();
    system("pause"); 
    return 0;   
}



1



0 / 0 / 0

Регистрация: 21.12.2015

Сообщений: 17

21.05.2016, 16:16

 [ТС]

9

Благодарю!



0



0 / 0 / 0

Регистрация: 24.05.2016

Сообщений: 2

24.05.2016, 13:08

10

А можно ли сделать так, чтобы при вводе искомого символа, программа искала его сразу во всем txt файле и все строки с этим символом переносила в конец txt файла. Просто сейчас она ищет первый попавшийся



0



Fixer_84

1505 / 968 / 812

Регистрация: 30.04.2016

Сообщений: 3,334

24.05.2016, 17:48

11

Klla, конечно можно Вот программа, отвечающая на ваш вопрос.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <iostream>
#include <cmath>
#include <string>
#include <vector>
#include <fstream>
 
using namespace std;
 
int main()
{
    ifstream fin("input.txt");
    ofstream fout("output.txt");
    string a, b;
    vector<std::string> c; 
    char sym;
    cout << "Введите искомый символ: ";
    cin >> sym; 
    while (getline(fin, a))
    {
        for (int i = 0; a[i]; i++)
        {
            if (a[i] == sym) 
            {
                b = a;
                c.push_back(b);
                break;
            }
        }
        fout << a << endl;
    }
    for (int i = 0; i < c.size(); i++)
    {
    fout << c[i] << endl;
    }
    fin.close();
    fout.close();
    system("pause"); 
    return 0;   
}



1



0 / 0 / 0

Регистрация: 24.05.2016

Сообщений: 2

25.05.2016, 01:13

12

Спасибо , но здесь отсутствует функция количества перевода строк(“Сколько раз перенести строку”), мне она тоже нужна, доработайте код если вас это не затруднит).



0



Fixer_84

1505 / 968 / 812

Регистрация: 30.04.2016

Сообщений: 3,334

25.05.2016, 17:55

13

Лучший ответ Сообщение было отмечено lllenium как решение

Решение

Klla, вот доработанная программа. Надеюсь, это то что нужно.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
#include <iostream>
#include <cmath>
#include <string>
#include <vector>
#include <fstream>
 
using namespace std;
 
int main()
{
    ifstream fin("input.txt");
    ofstream fout("output.txt");
    string a, b;
    vector<std::string> c; 
    char sym;
    int N, k;
    cout << "Введите искомый символ: ";
    cin >> sym; 
    cout << "Сколько раз перенести строки: ";
    cin >> N;
    while (getline(fin, a))
    {
        for (int i = 0; a[i]; i++)
        {
            if (a[i] == sym) 
            {
                b = a;
                c.push_back(b);
                break;
            }
        }
        fout << a << endl;
    }
    k = 0;
    while (k < N)
    {
    for (int i = 0; i < c.size(); i++)
    {
    fout << c[i] << endl;
    }
    k++;
    }
    fin.close();
    fout.close();
    system("pause"); 
    return 0;   
}



1



lllenium

0 / 0 / 0

Регистрация: 21.12.2015

Сообщений: 17

29.05.2016, 16:07

 [ТС]

14

Здравствуйте, не так давно вы по моей просьбе делали программу для поиска символа и переноса строк.
Она работает, но она не переносит строку, а копирует ее и вставляет в конец. Нужно чтобы она именно переносила строку, т.е. если строка первая в txt файле и в ней нужный символ, строка переходит в конец txt файла.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
#include <iostream>
#include <cmath>
#include <string>
#include <vector>
#include <fstream>
#include <stdlib.h>
 
using namespace std;
 
int main()
{   
    setlocale(LC_ALL, "Russian");
    ifstream fin("input.txt");
    ofstream fout("output.txt");
    string a, b;
    vector<std::string> c;
    char sym;
    int N, k;
    cout << "Введите символ: ";
    cin >> sym;
    cout << "Сколько раз перенести строки?: ";
    cin >> N;
    while (getline(fin, a))
    {
        for (int i = 0; a[i]; i++)
        {
            if (a[i] == sym)
            {
                b = a;
                c.push_back(b);
                break;
            }
        }
        fout << a << endl;
    }
    k = 0;
    while (k < N)
    {
    for (int i = 0; i < c.size(); i++)
    {
    fout << c[i] << endl;
    }
    k++;
    }
    fin.close();
    fout.close();
    printf ("Строки с символами перемещены, для просмотра откройте выходной файл n");
    system("pause");
    return 0;
}



0



Fixer_84

1505 / 968 / 812

Регистрация: 30.04.2016

Сообщений: 3,334

04.06.2016, 15:39

15

lllenium, никогда этого не делал. Вот программа. Надеюсь, она вас устроит.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
#include <iostream>
#include <cmath>
#include <string>
#include <vector>
#include <fstream>
 
using namespace std;
 
int main()
{
    ifstream fin("input.txt");
    ofstream fout("output.txt");
    string a, b;
    vector<std::string> c; 
    char sym;
    int N, k;
    cout << "Введите искомый символ: ";
    cin >> sym; 
    cout << "Сколько раз перенести строки: ";
    cin >> N;
    while (getline(fin, a))
    {
        for (int i = 0; a[i]; i++)
        {
            if (a[i] == sym) 
            {
                b = a;
                c.push_back(b);
                a = "t"; 
                break;
            }
        }
        if (a != "t")
        fout << a << endl;
    }
    k = 0;
    while (k < N)
    {
    for (int i = 0; i < c.size(); i++)
    {
    fout << c[i] << endl;
    }
    k++;
    }
    fin.close();
    fout.close();
    system("pause"); 
    return 0;   
}



1



My batch file reads the value of a registry key and stores its value in the variable key. So the value happens to be "H:KMSpicoKMSpicoUninst.exe" /u0=KMSpico
. I want to extract the part of this string that is enclosed in "". and store it in another variable, say uninstall. I could have easily done it by the following code: SET uninstall=%key:~1,30%. But the problem is that, the part before Uninst.exe, i.e. H:KMSpicoKMSpico which specifies the location of Uninst.exe might change depending upon the location where the user has installed the software, therefore the length of the part that is to be extracted might change. But the above code is set to extract the string only up to 30 characters.

Therefore, I wanted to know if there is way, so that we can somehow know the position of second " , so as to know the number of characters to be extracted. Or if there is some another way, to do this.

asked Apr 19, 2015 at 14:04

Dost Arora's user avatar

The simple FOR loop preserves quoted values as a single string. You know it is the first value, so simply GOTO a label to break out of the loop after a single iteration.

for %%A in (%key%) do set "uninstall=%%A"&goto :break
:break

answered Apr 19, 2015 at 16:56

dbenham's user avatar

dbenhamdbenham

127k28 gold badges248 silver badges385 bronze badges

So you are using a pirated windows? 🙂

try this

@echo off
rem :: I suppose you are capable to get the value from the registry and save is as variable.
set "reg_key="H:KMSpicoKMSpicoUninst.exe" /u0=KMSpico"
for /f "usebackq tokens=1" %%a in ('%reg_key%') do set "uninstaler=%%~a"
echo %uninstaler%

answered Apr 19, 2015 at 16:51

npocmaka's user avatar

npocmakanpocmaka

55k18 gold badges146 silver badges185 bronze badges

1

Как в текстовом документе найти определенную позицию

Я
   lanc2233

19.09.13 – 12:05

Столкнулся с весьма тупой проблемой 🙂

Есть текстовый файл. нужно перейти на определенную позицию символа (именно символа, а не строки). И просто посмотреть что там.

Не могу ни в одной программе это сделать. Единственная где показывают номер позиции в файле – это FAR, но там нужно перемещаться клавишами по файлу. И перейти на позицию №120000, где-то в середине файла весьма проблематично.

доступный арсенал :

FAR

Total

ms word 2010

или готов выкачать что-то другое.

   Галахад

1 – 19.09.13 – 12:08

Может 1С-ом попробовать?

   lanc2233

2 – 19.09.13 – 12:09

(1) походу это будет самый простой вариант ..

   DS

3 – 19.09.13 – 12:24

notepad++

   Kreont

4 – 19.09.13 – 12:25

FAR + Alt+F8

   kosts

5 – 19.09.13 – 12:28

(0) Нажми ctrl+g

   lanc2233

6 – 19.09.13 – 12:45

(5) из всего что там есть, нету перейти на позицию

  

mistеr

7 – 19.09.13 – 12:47

head

В этом посте мы обсудим, как найти индекс символа в строке на C++.

1. Использование string::find

The string::find функция-член возвращает индекс первого вхождения указанного символа в строку или string::npos если персонаж не найден. В следующем примере показан вызов этой функции:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

#include <iostream>

#include <string>

int main()

{

    std::string s = “C++20”;

    char c = ‘+’;

    int index = s.find(c);

    if (index != std::string::npos) {

        std::cout << “Character found at index “ << index << std::endl;

    } else {

        std::cout << “Character not found” << std::endl;

    }

    return 0;

}

Скачать  Выполнить код

результат:

Character found at index 1

 
Вот эквивалентная версия с использованием std::find стандартный алгоритм, который принимает диапазон для поиска указанного элемента и возвращает итератор к первому элементу в нем.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

#include <iostream>

#include <string>

#include <algorithm>

int main()

{

    std::string s = “C++20”;

    char c = ‘+’;

    auto it = std::find(s.begin(), s.end(), ‘+’);

    if (it != s.end()) {

        int index = std::distance(s.begin(), it);

        std::cout << “Character found at index “ << index << std::endl;

    } else {

        std::cout << “Character not found” << std::endl;

    }

    return 0;

}

Скачать  Выполнить код

результат:

Character found at index 1

2. Использование std::string_view

C++17 позволяет формировать строковое представление символьного литерала, используя std::literals::string_view_literals::operator””sv, заявлено в шапке <string_view>. Получив строковое представление, мы можем использовать find() функция, чтобы получить позицию первого символа данной последовательности символов, или std::string::npos если он не найден. Например,

#include <iostream>

#include <string_view>

using namespace std::string_view_literals;

int main()

{

    size_t index = “C++20”sv.find(‘+’);

    if (index != std::string::npos) {

        std::cout << “Character found at index “ << index << std::endl;

    } else {

        std::cout << “Character not found” << std::endl;

    }

    return 0;

}

Скачать код

результат:

Character found at index 1

Вот и все, что касается поиска индекса символа в строке в C++.

Спасибо за чтение.

Пожалуйста, используйте наш онлайн-компилятор размещать код в комментариях, используя C, C++, Java, Python, JavaScript, C#, PHP и многие другие популярные языки программирования.

Как мы? Порекомендуйте нас своим друзьям и помогите нам расти. Удачного кодирования 🙂

Вы не сообщили, в объекте какого типа у вас хранится строка.

Ниже показана демонстрационная программа, которая осуществляет поиск символа в символьном массиве s1 и в объекте с именем s2 класса std::string.

#include <iostream>
#include <string>
#include <cstring>

int main()
{
    char s1[] = "2 * 2 = 4";
    std::string s2( s1 );
    char c = '=';

    char *p = std::strchr( s1, c );

    if ( p != nullptr ) 
    {        
        std::cout << "Character " << c << " found at position " << p - s1 << std::endl;
        std::cout << "The rest of the string is "" << p << """ << std::endl;
    }

    std::string::size_type n = s2.find( c );

    if ( n != std::string::npos ) 
    {        
        std::cout << "Character " << c << " found at position " << n << std::endl;
        std::cout << "The rest of the string is "" << s2.substr( n ) << """ << std::endl;
    }
}

Вывод программы на консоль выглядит следующим образом:

Character '=' found at position 6
The rest of the string is "= 4"
Character '=' found at position 6
The rest of the string is "= 4"

Добавить комментарий