Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.56/18: Рейтинг темы: голосов - 18, средняя оценка - 4.56
3 / 3 / 0
Регистрация: 22.12.2010
Сообщений: 33
1

Неправильная запись в файл

24.01.2011, 17:54. Показов 3167. Ответов 11
Метки нет (Все метки)

Добрый вечер. Помогите, пожалуйста, найти ошибку в программе. В файл вводятся одни иероглифы((
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
#include<stdio.h>
#include<stdlib.h>
 
struct hardware
{
    int record;
    char *name;
    int quantity;
    float price;
};
 
typedef struct hardware List;
 
void createFile(List []);
 
main()
{
    int i;
    List hardw[100];
 
    for(i = 0; i < 100; i++)
    {
        hardw[i].record = i + 1;
        hardw[i].name = "unnamed";
        hardw[i].quantity = 0;
        hardw[i].price = 0.0;
    }
    createFile(hardw);
 
    system("pause");
}
 
void createFile(List hardw[])
{
    FILE *ptr;
    
    ptr = fopen("hardware.dat", "w+");
    fwrite(hardw, sizeof(List), 100, ptr);
    fclose(ptr);
}
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
24.01.2011, 17:54
Ответы с готовыми решениями:

Почему не создаётся файл и не производится запись в пустой файл?
Помогите разобраться почему не создаётся файл и не производится запись в пустой файл, в дебагере...

Запись в файл
Вывести список книг с фамилиями авторов в алфавитном порядке, изданных после заданного года. Все...

Запись массива в файл
Доброго времени суток. Подскажите пожалуйста, как теперь записать данные в файл? Что писать в...

Запись массива в файл
Взгляните на строки 49-64. Разбираюсь с аргументами коммандной строки) Суть: в функции search(o,...

11
599 / 567 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
24.01.2011, 18:49 2
чтобы нормально вводило используйте fprintf
а fwrite для бинарных файлов
0
3 / 3 / 0
Регистрация: 22.12.2010
Сообщений: 33
24.01.2011, 19:09  [ТС] 3
Разве с помощью fprintf можно создать файл произвольного доступа?
0
C/C++
93 / 93 / 18
Регистрация: 01.07.2010
Сообщений: 281
24.01.2011, 19:13 4
такое можно прочитать только с помощью специально написанной программы.
0
3 / 3 / 0
Регистрация: 22.12.2010
Сообщений: 33
24.01.2011, 19:35  [ТС] 5
Цитата Сообщение от МаксимМВ Посмотреть сообщение
такое можно прочитать только с помощью специально написанной программы.
Ты о чем?
0
599 / 567 / 104
Регистрация: 07.11.2010
Сообщений: 2,004
25.01.2011, 00:19 6
Цитата Сообщение от Lagobas Посмотреть сообщение
Ты о чем?
fprintf это форматированный ввод файл, попробуй. fwrite для бинарных файлов, для записи блока данных
0
3 / 3 / 0
Регистрация: 22.12.2010
Сообщений: 33
25.01.2011, 01:25  [ТС] 7
Ну так с помощью fprintf получится файл последовательного доступа. А мне нужен файл произвольного доступа. Читаю книгу Дейтела, таv используется fwrite и не для бинарных файлов. И листинги у него есть похожие на эту программу

Добавлено через 2 минуты
Допустим я буду записывать как бинарный. Открываю файл fopen("hardware.dat", "w+b"). Правильно? Все равно записывается билиберда какая-то. Хотя в учебнике я еще не дошел до бинарных файлов
0
4855 / 3276 / 467
Регистрация: 10.12.2008
Сообщений: 10,570
25.01.2011, 07:10 8
C
1
hardw[i].name = "unnamed";
с такой штукой нельзя использовать fwrite(), потому что fwrite() при записи структуры записывает только её содержимое, а в структуре есть только ячейка для хранения адреса первого символа строки, которая располагается совсем в другом месте
поэтому fwrite() записывает в файл содержимое ячейки, то есть адрес

Цитата Сообщение от Lagobas
Разве с помощью fprintf можно создать файл произвольного доступа?
fprintf() выводит в поток, она не создаёт файл также, как и fwrite()
произвольный доступ осуществляется с помощью fseek()
чтобы из файла не пропадали символы (типа там пробелов в пустых строках), нужно открывать его в двоичном режиме
0
3 / 3 / 0
Регистрация: 22.12.2010
Сообщений: 33
25.01.2011, 19:21  [ТС] 9
Запустил пару листингов из книги - ничего не работает. Такая же проблема. Могло быть такое что использование функции изменилось и что-то типо того? Учебник ппц древний. Хотя у меня даже числа не записываются
0
4855 / 3276 / 467
Регистрация: 10.12.2008
Сообщений: 10,570
26.01.2011, 02:10 10
первый исходник из книги ? а в ней написано, что он неправильный ?
потому что структуры неправильно сохраняются в файл

C
1
fwrite(hardw, sizeof(List), 100, ptr);
так нельзя делать, если в структуре есть указатели

по синтаксису вопросов нет, всё вполне допустимо
main() - старый стиль
0
3 / 3 / 0
Регистрация: 22.12.2010
Сообщений: 33
26.01.2011, 18:21  [ТС] 11
Прогу из первого поста писал сам по заданию из учебника. Делал на примере листингов из учебника, которые так же не правильно работают) Если fwrite не работает с указателями, то значит структура
C
1
2
3
4
5
6
struct hardware
{
        int record;
        int quantity;
        float price;
};
такого вида будет нормально записываться в файл?

Добавлено через 10 минут
Создаю файл и записываю одну структуру такого типа и получаю файл размером 12 байт, состоящий из пробелов оО
0
4855 / 3276 / 467
Регистрация: 10.12.2008
Сообщений: 10,570
27.01.2011, 03:32 12
Цитата Сообщение от Lagobas
то значит структура такого вида будет нормально записываться в файл?
останется только вопрос переносимости, на разных системах она может по-разному записываться и поэтому может быть потом неправильное восстановление, если поменяется компьютер (для устранения этого можно применять сериализацию)

пока занимаешься просто выяснением, как это работает на одном компьютере, так можно делать
такие данные не будут отображаться в удобном виде, они будут записаны в файл побайтово, и так как в структуре могут быть пустые промежутки, соответственно потом они также будут находится в файле
удостовериться, что всё записалось правильно, можно через hex-viewer

Цитата Сообщение от Lagobas
состоящий из пробелов
невидимые символы выглядят так, открой в hex'е

Добавлено через 6 минут
чтобы видеть данные, записанные в файл, в файл нужно записывать не байты, а символы
если ты делаешь putc('a', file);, в файл записывается
число
Python
1
2
3
4
5
>>> ord('a')
97
>>> hex(ord('a'))
'0x61'
>>>
, это число интерпретируется как символ 'a' и показывается на экране, когда ты открываешь файл в блокноте
оттуда и пробелы - в файл записались байты структуры, они - какие-то числа, эти числа пытаются интерпретироваться, но отображаемыми символами они не являются, поэтому блокнот отображает их в виде пробелов, а многие hex-viewer'ы отображают их в виде точек

пример
Код
[guest@localhost ~]$ echo -e '\x1\x2\x3' | hexdump -C
00000000  01 02 03 0a                                       |....|
00000004
[guest@localhost ~]$ echo -e 'abc' | hexdump -C
00000000  61 62 63 0a                                       |abc.|
00000004
[guest@localhost ~]$ echo -e 'ab\x01\x02\x03d' | hexdump -C
00000000  61 62 01 02 03 64 0a                              |ab...d.|
00000007
[guest@localhost ~]$
1
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
27.01.2011, 03:32

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

Не происходит запись в файл
Программа считывает строку с файла, считает в ней количество каждого символа. Результаты должна...

Не происходит запись в файл
первая программа,которая из 64 сс переводит в 2сс,все работает,после этого по желаению...

Запись в файл.Ошибка
Прошу помочь решить ошибку #include &lt;sys/sysinfo.h&gt; #include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; int...


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

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

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