Форум программистов, компьютерный форум, киберфорум
Наши страницы
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Roman2947
2 / 2 / 1
Регистрация: 11.07.2016
Сообщений: 124
1

Как ведут себя функции ввода вывода при работе с файлами

30.04.2017, 13:29. Просмотров 392. Ответов 12
Метки нет (Все метки)

Здравствуйте!!!
прошу подсказки в отладке данного кода.
цель его посмотреть наглядно как ведут себя функции ввода вывода при работе с файлами...
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
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#pragma warning (disable:4996)
 
int main()
{
    FILE *file;
    char str[25];
    char str1[25];
    if ((file = fopen("D:/testfile.txt", "w")) == NULL)
        puts("Error opening file");
    else
    {
        puts("*************************");
        scanf("%s",str);
        fprintf(file,"%s",str);
        fscanf(file,"%s",str1);
        printf("%s\n",str1);
        puts("*************************");
        gets(str);
        fputs(str,file);
        fgets(str, 25, file);
        puts(str1);
        puts("*************************");
        
    }
 
 
    getch(); 
}
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
30.04.2017, 13:29
Ответы с готовыми решениями:

В чем разница в работе с файлами и потоком ввода вывода файлов?
Всем доброго времени суток! Подскажите пожалуйста, в чём разница между потоком ввода вывода файлов...

Укажите функции ввода-вывода для работы с бинарными файлами
Укажите функции ввода-вывода для работы с бинарными файлами

Ошибка ввода-вывода 103 при работе с текстовым файлом
При использовании статичного имени внешнего файла, к примеру &quot;test0&quot;, код работает, файл создаётся...

Ошибка при работе с потоками ввода (вывода) в файл (из файла)
Изучаю перегрузку операторов ввода/вывода с файлом и без. Вылетает такая ошибка при отработанном...

Использование операторов ввода (InputBox) и вывода (MsgBox) при работе с массивами данных
Составить программу, формирующую одномерный массив из модулей минимальных элементов соответствующих...

12
Tygragar
2 / 2 / 2
Регистрация: 28.02.2017
Сообщений: 22
30.04.2017, 13:39 2
Вы не открываете файл, а сразу
C
1
  if ((file = fopen("D:/testfile.txt", "w")) == NULL)
Открывайте файл так

C
1
2
fopen_s(&file, D:/testfile.txt", "r");
if (file == NULL)
0
Roman2947
2 / 2 / 1
Регистрация: 11.07.2016
Сообщений: 124
30.04.2017, 13:53  [ТС] 3
Цитата Сообщение от Tygragar Посмотреть сообщение
Вы не открываете файл, а сразу
CВыделить код
1
* if ((file = fopen("D:/testfile.txt", "w")) == NULL)
как не открываю???? в учебнике точно таким же образом описано....

Добавлено через 1 минуту
Цитата Сообщение от Tygragar Посмотреть сообщение
Вы не открываете файл, а сразу
ну и ли таком способ встречал
C
1
2
file=fopen("D:/testfile.txt", "w");
if(file==NULL)
Добавлено через 1 минуту
Цитата Сообщение от Tygragar Посмотреть сообщение
Вы не открываете файл
да и если б я не открывал файл,то if получил бы истину и выскочила бы строка "Error opening file"
разве нет?
0
Tygragar
2 / 2 / 2
Регистрация: 28.02.2017
Сообщений: 22
30.04.2017, 13:54 4
Цитата Сообщение от Roman2947 Посмотреть сообщение
ну и ли таком способ встречал
CВыделить код
1
2
file=fopen("D:/testfile.txt", "w");
if(file==NULL)
Можно и так. В любом случае сначала нужно открыть, а потом проверять на пустоту с помощью
C
1
if
0
30.04.2017, 13:54
Roman2947
2 / 2 / 1
Регистрация: 11.07.2016
Сообщений: 124
30.04.2017, 13:58  [ТС] 5
Цитата Сообщение от Tygragar Посмотреть сообщение
В любом случае сначала нужно открыть, а потом проверять на пустоту
прошу пояснить почему?

Добавлено через 1 минуту
Цитата Сообщение от Roman2947 Посмотреть сообщение
Вы не открываете файл,
проверки ради закомментил код с 18 строки введ бурду, программа завершилась ,а после открыл файл и все оказалось на месте, т. е почти все до пробела в строке) следовательно проблемы начинаются с 18 строки
0
likehood
989 / 831 / 397
Регистрация: 25.12.2016
Сообщений: 2,727
Завершенные тесты: 3
30.04.2017, 15:04 6
Roman2947, у вас смешаны операции записи и чтения файла, что не есть гут, тем более, что файл открыт только в режиме записи. Лучше разбейте программу на две части: в одной только операции записи, в другой - операции чтения. И в начале каждой части открывайте файл в нужном режиме.

Добавлено через 2 минуты
Цитата Сообщение от Tygragar Посмотреть сообщение
В любом случае сначала нужно открыть, а потом проверять на пустоту с помощью if
Можно и как у автора - в одну строку. Особой разницы нет.
0
Roman2947
2 / 2 / 1
Регистрация: 11.07.2016
Сообщений: 124
30.04.2017, 15:17  [ТС] 7
Цитата Сообщение от likehood Посмотреть сообщение
что файл открыт только в режиме записи
1.да согласен, я его переоткрыл в режиме "r+"
2. да я ради тренировки все смешал. вопрос "красоты кода" не стоит....можно же и подобный бардак сделать рабочим.
3.Нет ли необходимости после того как данные будут записаны в файл его закрыть и снова открыть для чтения? т.е.переоткрыть?
0
likehood
989 / 831 / 397
Регистрация: 25.12.2016
Сообщений: 2,727
Завершенные тесты: 3
30.04.2017, 15:21 8
Цитата Сообщение от Roman2947 Посмотреть сообщение
Нет ли необходимости после того как данные будут записаны в файл его закрыть и снова открыть для чтения? т.е.переоткрыть?
Если файл изначально был открыт только в режиме записи, то для чтения придётся открыть заново.
0
Roman2947
2 / 2 / 1
Регистрация: 11.07.2016
Сообщений: 124
30.04.2017, 15:27  [ТС] 9
Цитата Сообщение от likehood Посмотреть сообщение
Если файл изначально был открыт только в режиме записи, то для чтения придётся открыть заново.
открыл файл в режиме "r+" записал данные в него но считать не смог,затем перед чтением я его переоткрыл все успешно! это норма? тогда как же работает режим "r+"?
0
likehood
989 / 831 / 397
Регистрация: 25.12.2016
Сообщений: 2,727
Завершенные тесты: 3
30.04.2017, 15:34 10
Там ещё нужно текущую позицию изменить, см. функции fseek, ftell.

Добавлено через 2 минуты
То есть, при записи курсор смещается в конец записанного блока, в данном случае - в конец файла. Чтобы прочитать записанное, нужно вернуть курсор к началу.
0
Roman2947
2 / 2 / 1
Регистрация: 11.07.2016
Сообщений: 124
30.04.2017, 15:41  [ТС] 11
Цитата Сообщение от likehood Посмотреть сообщение
см. функции fseek, ftell.
это пока рано,с простыми делами разобраться бы)

Добавлено через 57 секунд
так вот вроде бы работает исправно
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 <stdio.h>
#include <conio.h>
#include <stdlib.h>
#pragma warning (disable:4996)
 
int main()
{
    FILE *file;
    char str[10] = {0};
    char str1[10] = {0};
    if ((file = fopen("D:/testfile.txt", "w+")) == NULL)
        puts("Error opening file");
    else
    {
        puts("*************************");
        scanf("%s",str);
        printf("---%s\n",str); 
        fprintf(file,"%s",str);
        //freopen("testfile.txt","r+",file);
        fclose(file);
        file = fopen("D:/testfile.txt", "r");
        printf("---%s\n", str1);
        fscanf(file, "%s", str1);
        printf("***%s", str1);
    
    }
    getch(); 
}
Добавлено через 2 минуты
но стоит не переоткрыть файл, то ничего не считывается.
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if ((file = fopen("D:/testfile.txt", "w+")) == NULL)
        puts("Error opening file");
    else
    {
        puts("*************************");
        scanf("%s",str);
        printf("---%s\n",str); 
        fprintf(file,"%s",str);
        //freopen("testfile.txt","r+",file);
        //fclose(file);
        //file = fopen("D:/testfile.txt", "r");
        printf("---%s\n", str1);
        fscanf(file, "%s", str1);
        printf("***%s", str1);
Добавлено через 2 минуты
кстати с функцией freopen(),недопонимание,как ее правильно применить в данном случае?
0
likehood
989 / 831 / 397
Регистрация: 25.12.2016
Сообщений: 2,727
Завершенные тесты: 3
30.04.2017, 15:46 12
Цитата Сообщение от Roman2947 Посмотреть сообщение
это пока рано,с простыми делами разобраться бы)
Да там нет ничего сложного. ftell возвращает текущую позицию файла, а fseek перемещает эту позицию в нужную точку, например в начало файла.

Добавлено через 3 минуты
Цитата Сообщение от Roman2947 Посмотреть сообщение
кстати с функцией freopen(),недопонимание,как ее правильно применить в данном случае?
Можно в качестве первого параметра передать NULL, тогда будет изменён режим доступа к уже открытому файлу.
0
Roman2947
2 / 2 / 1
Регистрация: 11.07.2016
Сообщений: 124
30.04.2017, 16:04  [ТС] 13
Цитата Сообщение от likehood Посмотреть сообщение
Можно в качестве первого параметра передать NULL
freopen(NULL, "r+", file); не работает)); а так freopen("D:/testfile.txt", "r+", file); работает)
0
30.04.2017, 16:04
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.04.2017, 16:04

Использование операторов ввода (InputBox) и вывода (MsgBox) при работе с массивами данных
Составить программу вычисления номера столбца матрицы размера 4x4, состоящей из нулей и единиц,...

Использование операторов ввода (InputBox) и вывода (MsgBox) при работе с массивами данных
Составить программу, формирующую одномерный массив из сумм квадратов элементов соответствующих...

Использование операторов ввода (InputBox) и вывода (MsgBox) при работе с массивами данных в Excel
Составить программу, формирующую одномерный массив из сумм квадратов элементов соответствующих...


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

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

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