Форум программистов, компьютерный форум, киберфорум
Visual C++
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.78/18: Рейтинг темы: голосов - 18, средняя оценка - 4.78
1 / 1 / 0
Регистрация: 04.06.2019
Сообщений: 39
1

Работа с библиотекой Srting

29.10.2019, 22:39. Показов 3584. Ответов 29

Author24 — интернет-сервис помощи студентам
Здравствуйте! Вообщем, я работал со строками, которые обьявлял просто, через чар, сел на библиотеку String и перестало работать множество функций для работы с файлами. Помогите пожалуйста
П.С. подчеркивает 10 строку букву а
C
1
2
3
4
5
6
7
8
9
10
11
12
13
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <iostream>
#include <string>
using namespace std;
void main()
{
    string a;
    FILE* f = fopen("f.txt","r");
    fgets(a,255, f);
    fclose(f);
    system("pause");
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
29.10.2019, 22:39
Ответы с готовыми решениями:

Поля to Srting
Добрый день! есть к примеру такой класс class City { String City_name; String Country;

Нужна летиратура, в которой бы описывались работа с событиями, работа с элементами управления
Помогите пожалуйста найти летиратуру, в которой бы описывались работа с событиями,работа со всеми...

Работа - проведение обучающих семинаров по C#. Работа по выходным дням ( сб-вс - 32 часа). От 30 000р.
Обязанности - проведение обучающих семинаров по C# Базовый (начальный уровень). Опыт...

Работа формы в фоне, вне фокуса (работа с раскладкой клавиатуры)
Как заставить это работать в фоне? Даный код работает пока форма в фокусе, как только ее...

29
фрилансер
5832 / 5349 / 1100
Регистрация: 11.10.2019
Сообщений: 14,301
29.10.2019, 22:58 2
перед строкой 10 вставь строку

C++
1
a.resize(255,'\0');
0
1 / 1 / 0
Регистрация: 04.06.2019
Сообщений: 39
29.10.2019, 23:03  [ТС] 3
Не помогло, не в том проблема, так как даже если вместо 255 поставить a.size() в фгетсе. Мистика
0
фрилансер
5832 / 5349 / 1100
Регистрация: 11.10.2019
Сообщений: 14,301
29.10.2019, 23:06 4
chueveve, ну да

C++
1
fgets(&a[0],a.size(), f);
0
1 / 1 / 0
Регистрация: 04.06.2019
Сообщений: 39
29.10.2019, 23:10  [ТС] 5
Считало, но первый символ, а не строку

Добавлено через 2 минуты
Спасибо, что пытаетесь помочь, Считало, но первый символ, а не строку
0
фрилансер
5832 / 5349 / 1100
Регистрация: 11.10.2019
Сообщений: 14,301
29.10.2019, 23:11 6
chueveve, ну вот в этом я не подскажу. Попробуй класс std::ifstream
0
1 / 1 / 0
Регистрация: 04.06.2019
Сообщений: 39
29.10.2019, 23:17  [ТС] 7
Я с ней не работал, вы знаете функцию на подобии фгетс? Я ее потом изучу
0
фрилансер
5832 / 5349 / 1100
Регистрация: 11.10.2019
Сообщений: 14,301
29.10.2019, 23:29 8
chueveve, я не работаю ни с FILE* , ни с std::ifstream , у меня WinAPI, MFC и Qt Поэтому я вот так с ходу ничего не смогу подсказать по стандартным функциям, но зато в гугле можно найти примеры, и выглядят они несложно https://metanit.com/cpp/tutorial/8.3.php
1
1 / 1 / 0
Регистрация: 04.06.2019
Сообщений: 39
29.10.2019, 23:33  [ТС] 9
Спасибо!
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
30.10.2019, 09:37 10
Лучший ответ Сообщение было отмечено chueveve как решение

Решение

Цитата Сообщение от chueveve Посмотреть сообщение
Я с ней не работал, вы знаете функцию на подобии фгетс? Я ее потом изучу
Как-то так
C++
1
2
3
4
5
6
7
8
#include <fstream>
int main()
{
    string a;
    std::ifstream in("f.txt");
    in >> a;
    system("pause");
}
И - плохая идея использовать fgets вместе с std::string
1
фрилансер
5832 / 5349 / 1100
Регистрация: 11.10.2019
Сообщений: 14,301
30.10.2019, 09:44 11
oleg-m1973, если размер правильно выделять, то нет разницы, это такой же массив char
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
30.10.2019, 09:50 12
Цитата Сообщение от Алексей1153 Посмотреть сообщение
oleg-m1973, если размер правильно выделять, то нет разницы, это такой же массив char
Нет, не такой же. Как минимум, у него там есть ещё переменная size, можешь на этом довольно серьёзно просрать в дальнейшем.
Там, где нужен массив символов, используй char[.....], std::string нифига под это не заточен. Хотя, стоит добавить, что мне это тоже не нравится.
0
фрилансер
5832 / 5349 / 1100
Регистрация: 11.10.2019
Сообщений: 14,301
30.10.2019, 10:29 13
oleg-m1973, повторю, std::string - это оболочка для массива char. Плюс всегда гарантируется, что после этого массива есть char со значением '\0'. Плюсы - динамика инкапсулирована, это защита от утечек и удобство при использовании вообще.

задание размера: resize/assign/push_back ...
получение размера: size()
получение константного указателя на начало буфера: c_str()
произвольный доступ - iterator или оператор []

s[6] - неконстантная ссылка на элемент с индексом 6
&s[6] - неконстантный указатель на элемент с индексом 6

Если не нужен обязательный завершающий zt, то можно воспользоваться std::vector<char>


так что не надо утверждений, что это не одно и то же Это оболочка, пользуйся методами
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
30.10.2019, 10:35 14
Цитата Сообщение от Алексей1153 Посмотреть сообщение
oleg-m1973, повторю, std::string - это оболочка для массива char. Плюс всегда гарантируется, что после этого массива есть char со значением '\0'. Плюсы - динамика инкапсулирована, это защита от утечек и удобство при использовании вообще.
И я тебе ещё раз повторю - использовать std::string и std::vector в качестве буфера для сишных функций - это очень плохой стиль. И лучше сразу тупо запомнить, что этого делать нельзя.
0
фрилансер
5832 / 5349 / 1100
Регистрация: 11.10.2019
Сообщений: 14,301
30.10.2019, 10:42 15
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
использовать std::string и std::vector в качестве буфера для сишных функций - это очень плохой стиль
ничем не обоснованное утверждение. Ты же пользуешься new/delete и не боишься, тут всё точно так же, только внутри класса. Я пользуюсь ими уже больше 10 лет и не знаю проблем. Потому что понимаю, как они устроены

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
нельзя
льзя Даже нужно. Будет экономия времени, нервов и раз в 100 меньше ошибок
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
30.10.2019, 11:04 16
Цитата Сообщение от Алексей1153 Посмотреть сообщение
ничем не обоснованное утверждение. Ты же пользуешься new/delete и не боишься, тут всё точно так же, только внутри класса. Я пользуюсь ими уже больше 10 лет и не знаю проблем. Потому что понимаю, как они устроены
Если бы ты понимал как они устроены, то ты бы знал, что это классы со своим внутреним представлением и своей реализацией.
Когда ты напрямую пишешь в них, пользуясь своим "пониманием", то тебе, как минимум, нужен будет ещё дополнительный код, чтобы объект остался в консистентном состоянии. Это источник ошибок, довольно серьёзный.
И есть ещё вопрос производительности - ты можешь создать std::vector нужного размера, не заполняя его нулями? И гарантируешь ли, что resize на увеличение не заполнит новое место нулями?
0
фрилансер
5832 / 5349 / 1100
Регистрация: 11.10.2019
Сообщений: 14,301
30.10.2019, 11:14 17
Цитата Сообщение от oleg-m1973 Посмотреть сообщение
ты можешь создать std::vector нужного размера, не заполняя его нулями? И гарантируешь ли, что resize на увеличение не заполнит новое место нулями?
std::vector v(len);//без инициализации
std::vector v(len,val);//с инициализацией
resize(newlen) - увеличение без инициализации
resize(newlen,val) - увеличение с инициализацией

только зачем об этом думать, это ни на что не влияет в плане производительности.

Цитата Сообщение от oleg-m1973 Посмотреть сообщение
Когда ты напрямую пишешь в них
выделяешь нужный размер в контейнере и спокойно пишешь туда напрямую. Они для этого предназначены. Не понимаю причин твоей паники.
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
30.10.2019, 11:23 18
Цитата Сообщение от Алексей1153 Посмотреть сообщение
resize(newlen) - увеличение без инициализации
Покажи, где сказано, что это увеличение без инициализации не заполняет нулями.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
        std::vector<int> v;
        v.reserve(100);
        for (int  i = 0; i < 10; ++i)
            v[i] = i;
 
        for (size_t i = 0; i < 10; ++i)
            std::cout << v.data()[i] << ", ";
        std::cout << std::endl;
 
        v.resize(10);
 
        for (size_t i = 0; i < 10; ++i)
            std::cout << v.data()[i] << ", ";
        std::cout << std::endl;
Добавлено через 1 минуту
Цитата Сообщение от Алексей1153 Посмотреть сообщение
только зачем об этом думать, это ни на что не влияет в плане производительности.
Вообще, дополнительный проход по массиву влияет - была сложность O(N), стала O(2N).
(На этом основаны многие демонстрации того, что Си быстрее, чем С++)
0
1 / 1 / 0
Регистрация: 04.06.2019
Сообщений: 39
30.10.2019, 15:19  [ТС] 19
oleg-m1973, это похоже больше на правду но, есть ошибки в открытии файла и соответственно в 6й строке. Библиотеку подключит истрим
0
6770 / 4564 / 1843
Регистрация: 07.05.2019
Сообщений: 13,726
30.10.2019, 15:22 20
Цитата Сообщение от chueveve Посмотреть сообщение
oleg-m1973, это похоже больше на правду но, есть ошибки в открытии файла и соответственно в 6й строке. Библиотеку подключит истрим
Что за ошибки?
0
30.10.2019, 15:22
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
30.10.2019, 15:22
Помогаю со студенческими работами здесь

Количество подведенного и отведенного тепла, работа сжатия, работа расширения
Определить количество подведенного и отведенного тепла, работу сжатия, работу расширения, полезную...

Работа с Меню. Сохранение, печать, создать новый. Работа с рисованием
В общем сабж. Делается программа, которая должная Сохранять, печатать и очищать поле (создать...

Работа с файловой системой (системное название некоторых папок и работа со скрытыми документами)
Всем привет, подскажите каким образом можно из VBA сохранить документ txt в папке &quot;Общие...

Нужна книга, где рассматриваются работа с прерываниями, указатели, работа с памятью, ассемблерные вставки
Привет всем! Подскажите, пожалуйста, хорошую книгу по C (именно C, не C++). Интересует работа с...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru