Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
1

При чтении из файла пропускается вторая строка

11.11.2015, 11:16. Показов 1009. Ответов 10
Метки нет (Все метки)

Что не делаю, при чтении постоянно пропускает вторую строчку из файла.
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
#include<iostream>
#include<stdio.h>
using namespace std;
int main() {
 
    FILE * ptrFile = NULL;
    errno_t err=fopen_s(&ptrFile, "stick.txt", "r");
    char mystring[BUFSIZ];
    char*buf = new char[BUFSIZ]();
    setvbuf(ptrFile, mystring, _IOLBF, BUFSIZ);
    if (ptrFile == NULL)
        perror("Error");
    else
    {   
        
        while (!feof(ptrFile))
        {           
            fgets(mystring, BUFSIZ, ptrFile);
            if(strlen(mystring)>strlen(buf))
            strcpy_s(buf, BUFSIZ, mystring);
            cout << buf << "\n\n";          
        }   
             
        fclose(ptrFile);
    }
 
    return 0;
}
0
Миниатюры
При чтении из файла пропускается вторая строка   При чтении из файла пропускается вторая строка  
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
11.11.2015, 11:16
Ответы с готовыми решениями:

Почему пропускается строка при чтении XML файла?
Доброго времени суток дамы и господа. Столкнулся с такой проблемой. Есть XML файл, я его разбираю и...

Почему начинающаяся с точки с запятой строка из текстовогого файла пропускается при разборе строк в цикле FOR?
Вот код: @echo off for /f &quot;usebackq delims=&quot; %%n in (&quot;12.txt&quot;) do ( echo %%n ) pause Вот...

Есть строка определенной длины. Вторая строка меньше первой. Найти точку в которой вторая строка входит в первую
Условие: Есть строка определенной длины. Вторая строка меньше первой. Найти точку в которой...

При чтении текстового файла дублируется последняя строка
Всем доброго времени суток, мне нужно было написать программу в С++ следующего условия: В...

10
16 / 16 / 10
Регистрация: 19.10.2015
Сообщений: 34
11.11.2015, 12:28 2
Лучший ответ Сообщение было отмечено anti-k как решение

Решение

Смотри комменты по коду
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
#include<iostream>
#include<stdio.h>
 
using namespace std;
int main() {
 
    
    FILE * ptrFile = NULL;
    errno_t err = fopen_s(&ptrFile, "stick.txt", "r"); ///<--- Здесь пакостная ссылка
    char mystring[BUFSIZ];
    char*buf = new char[BUFSIZ]();
    //setvbuf(ptrFile, mystring, _IOLBF, BUFSIZ); //Здесь ссылка пакостила
    if (ptrFile == NULL)
        perror("Error");
    else
    {
 
        while (!feof(ptrFile))
        {
            fgets(mystring, BUFSIZ, ptrFile);
        //  if (strlen(mystring)>strlen(buf)) // Неотступно тащит ошибки твоя ссылка
                strcpy_s(buf, BUFSIZ, mystring);
            cout << buf << "\n\n";
        }
 
        fclose(ptrFile);
    }
 
    return 0;
}
1
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
11.11.2015, 13:01  [ТС] 3
kJIuk,
Спасибо! А как можно подвязать буфер под входной поток? И если можно почему съедала именно 2-ую строку а
остальное не трогала?
0
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
13.11.2015, 12:48  [ТС] 4
В связи с очевидной личной умственной отсталостью ничего не понял
Снова нарываюсь на ту же ошибку.
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
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
void Find(FILE*ptr)
{
    char*buf = new char[BUFSIZ]();
    rewind(ptr);
    setvbuf(ptr, buf, _IOLBF, BUFSIZ);
 
    while (!feof(ptr))
    {
        fgets(buf, BUFSIZ, ptr);
        cout << buf << endl << endl;
    }
        
}
int main(){
    
    FILE*text = NULL;
    errno_t err = fopen_s(&text, "creep.txt", "r+");
    if (err)
    {
        cerr << "error :" << err << " " << stderr << endl;
        exit(1);
    }
    Find(text);
    return 0;
}
Добавлено через 1 минуту
Вторую строчку файла по традиции пропускает, затем запись в буфер не корректна.
0
16 / 16 / 10
Регистрация: 19.10.2015
Сообщений: 34
13.11.2015, 13:49 5
Просто сделай так
C++
1
2
//rewind(ptr);
    //setvbuf(ptr, buf, _IOLBF, BUFSIZ);
1
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
13.11.2015, 13:57  [ТС] 6
kJIuk,
Цитата Сообщение от anti-k Посмотреть сообщение
char*buf = new char[BUFSIZ]();
* * rewind(ptr);
* * setvbuf(ptr, buf, _IOLBF, BUFSIZ);
ведет себя точно так же.

Добавлено через 46 секунд
kJIuk, Мне вот намекнули что я меняю размер буфера, может в этом дело?

Добавлено через 59 секунд
kJIuk,
Или надо в мэйн rewind сделать?
0
16 / 16 / 10
Регистрация: 19.10.2015
Сообщений: 34
13.11.2015, 13:59 7
попробуй setvbuf(ptr, buf, _IONBF, BUFSIZ); _IO-->N<--BF

вообще, ты наверно не перекомпилировал программу после того, как закомментировал, а _IOLBF и _IOFBF действительно что-то делают с буфером
1
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
13.11.2015, 14:05  [ТС] 8
kJIuk,
Цитата Сообщение от kJIuk Посмотреть сообщение
не перекомпилировал программу после того, как закомментировал
вы имеете ввиду после того как вы исправили? Я компилировал, без привязки к потоку все чикает, охота понять
именно setbuf. Сейчас попробую
Цитата Сообщение от kJIuk Посмотреть сообщение
setvbuf(ptr, buf, _IONBF, BUFSIZ); _IO-->N<--BF
0
16 / 16 / 10
Регистрация: 19.10.2015
Сообщений: 34
13.11.2015, 14:07 9
Обрати внимание, что пишут МСДН по этой функции


Функция setvbuf позволяет программе управлять и буферизованием и размером буфера для потока. поток должен относиться к открытому файлу, который не подвергся операции по вводу/выводу, так как он был открыт.
0
227 / 75 / 31
Регистрация: 17.07.2015
Сообщений: 774
13.11.2015, 14:13  [ТС] 10
kJIuk,
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
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
void Find(FILE*ptr)
{
    char*buf = new char[BUFSIZ]();
    rewind(ptr);
    setvbuf(ptr, buf, _IOLBF, BUFSIZ);
 
    while (!feof(ptr))
    {
        fgets(buf, BUFSIZ, ptr);
        cout << buf << endl << endl;
    }
        
}
int main(){
    
    FILE*text = NULL;
    errno_t err = fopen_s(&text, "creep.txt", "r+");
    if (err)
    {
        cerr << "error :" << err << " " << stderr << endl;
        exit(1);
    }
    Find(text);
    return 0;
}
Но в этом случае не было ни ввода ни вывода, обычная визуаловская привязка потока к файлу.
Можете объяснить по по поводу _IO-->N<--BF, не до конца понятно
0
16 / 16 / 10
Регистрация: 19.10.2015
Сообщений: 34
13.11.2015, 14:18 11
Лучший ответ Сообщение было отмечено anti-k как решение

Решение

Вот так все работает
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
#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
void Find(FILE*ptr)
{
    char*buf = new char[BUFSIZ]();
    
    setvbuf(ptr, buf, _IONBF, BUFSIZ);
    rewind(ptr);
 
    while (!feof(ptr))
    {
        fgets(buf, BUFSIZ, ptr);
        cout << buf << endl << endl;
    }
 
}
int main(){
 
    FILE*text = NULL;
    errno_t err = fopen_s(&text, "creep.txt", "r+");
    if (err)
    {
        cerr << "error :" << err << " " << stderr << endl;
        exit(1);
    }
    Find(text);
 
    system("PAUSE");
    return 0;
}
_IONBF буфер не используется, независимо от буфера или размера
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.11.2015, 14:18

Почему возращается пустая строка при чтении ini-файла?
Всем привет. Непойму почему мне возращается пустая строка.К примеру есть переменная: const char...

"Нарушение прав доступа при чтении по адресу" при чтении структур из бинарного файла
Пытаюсь разобраться со структурами в бинарных файлах. Допустим, есть массив структур. Записываю...

Сформировать матрицу: первая строка - произвольные числа, вторая строка - квадраты этих чисел, третья строка - кубы
Кто сможет помочь в написании программы по вот этому заданию, буду очень признателен кто окажет мне...

Пропускается строка кода
Здравствуйте. Есть такой код: #include &quot;stdafx.h&quot; #include &quot;conio.h&quot; #include &lt;string&gt;...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.