Fopen s c как использовать
НАЗВАНИЕ
fseek, rewind, ftell — установка текущей позиции потока
#include int fseek (stream, offset, ptrname) FILE *stream; long offset; int ptrname; void rewind (stream) FILE *stream; long ftell (stream) FILE *stream;
ОПИСАНИЕ
Функция fseek устанавливает позицию следующей операции ввода/вывода для потока stream. Новая позиция находится на расстоянии offset байт от начала, от текущей позиции или от байта, содержащего признак конца файла в зависимости от значения аргумента ptrname (0, 1 или 2 соответственно). Если значение offset отрицательно, то новая позиция будет расположена левее точки отсчета.
Действие функции rewind (stream) совпадает с действием функции fseek (stream, 0L, 0). Отличие только в том, что функция rewind не возвращает никакого значения.
Функции fseek и rewind аннулируют действие функции ungetc(3S).
В файле, открытом для чтения и записи, после вызова функций fseek и rewind допустимы как операции чтения, так и записи.
Функция ftell возвращает смещение текущей позиции относительно начала файла, ассоциированного с указанным потоком stream.
ДИАГНОСТИКА
При неудачном завершении функция fseek возвращает ненулевое значение, в противном случае результат равен 0. Неудача может об ясняться тем, что файл не был открыт посредством функции fopen; в частности, функцию fseek нельзя использовать для потоков, ассоциированных с терминалом, а также для файлов, открытых функцией popen(3S).
| Comments: info@citmgu.ru Designed by Andrey Novikov Copyright © CIT |
fopen , _wfopen
Открывает файл. Доступны более безопасные версии этих функций, которые выполняют больше проверки параметров и возвращают коды ошибок; see fopen_s , _wfopen_s .
Синтаксис
FILE *fopen( const char *filename, const char *mode ); FILE *_wfopen( const wchar_t *filename, const wchar_t *mode );
Параметры
mode
Включенный тип доступа.
Возвращаемое значение
Каждая из этих функций возвращает указатель на открытый файл. Значение указателя null обозначает ошибку. Если filename или есть NULL или mode пустая строка, эти функции активируют недопустимый обработчик параметров, который описан в разделе «Проверка параметров». Если продолжение выполнения разрешено, эти функции возвращают NULL и устанавливают для errno значение EINVAL .
Замечания
Функция fopen открывает файл, указанный в filename файле. По умолчанию узкая filename строка интерпретируется с помощью кодовой страницы ANSI ( CP_ACP ). В классических приложениях Windows его можно изменить на кодовую страницу OEM ( CP_OEMCP ) с помощью SetFileApisToOEM функции. Вы можете использовать AreFileApisANSI функцию, чтобы определить, интерпретируется ли filename она с помощью ANSI или системной кодовой страницы OEM по умолчанию. _wfopen — это широкозначная версия fopen _wfopen ; аргументы являются строками расширенных символов. В противном случае поведение _wfopen и fopen идентично. Просто использование _wfopen не влияет на закодированный набор символов, используемый в потоке файлов.
fopen принимает пути, допустимые в файловой системе, в точке выполнения; fopen принимает UNC-пути и пути, содержащие сопоставленные сетевые диски, если выполняющая код система имеет доступ к общей папке или сопоставленному диску во время выполнения. При создании путей для этого убедитесь, что диски, пути fopen или сетевые ресурсы доступны в среде выполнения. Вы можете использовать косую черту ( / ) или обратные косые черты ( \ ) в качестве разделителей каталогов в пути.
Всегда проверка возвращаемое значение, чтобы узнать, имеет ли указатель ЗНАЧЕНИЕ NULL перед выполнением других операций в файле. Если возникает ошибка, глобальная переменная errno задана и может использоваться для получения определенных сведений об ошибке. Дополнительные сведения см. в разделе errno , _doserrno , _sys_errlist , и _sys_nerr .
По умолчанию глобальное состояние этой функции ограничивается приложением. Чтобы изменить его, ознакомьтесь с глобальным состоянием в CRT.
Поддержка Юникода
fopen поддерживает файловые потоки Юникода. Чтобы открыть файл Юникода, передайте флаг ccs=encoding , задающий нужную кодировку, в fopen следующим образом.
FILE *fp = fopen(«newfile.txt», «rt+, ccs=UTF-8»);
Допустимые значения для ccs кодирования: UNICODE и UTF-8 UTF-16LE .
Если файл открывается в режиме Юникода, функции ввода преобразуют данные, считываемые из файла в данные UTF-16, хранимые с типом wchar_t . Затем функции, которые выполняют запись в файл, открытый в режиме Юникода, ожидают буферы, содержащие данные UTF-16, хранимые с типом wchar_t . Если файл закодирован как UTF-8, данные UTF-16 превратятся в UTF-8 при записи. Содержимое в кодировке UTF-8 преобразуется в UTF-16 при чтении. Попытка чтения или записи нечетного числа байт в режиме Юникода приводит к возникновению ошибки проверки параметра . Для чтения или записи данных, хранимых в программе в кодировке UTF-8, используйте режим текстового или двоичного файла вместо режима Юникода. Вы несете ответственность за любой необходимый перевод кодировки.
Если файл уже существует и открыт для чтения или добавления, то любой знак порядка байтов (BOM) в файле определяет кодировку. Кодировка BOM имеет приоритет над кодировкой, указанной флагом ccs . Кодирование ccs используется, только если метка BOM отсутствует или речь идет о новом файле.
Обнаружение метки BOM применяется только к файлам, которые будут открываться в режиме Юникода (т е путем передачи флага ccs ).
В следующей таблице приведены режимы, которые используются для различных флагов ccs , присвоенных fopen и метка порядка байтов в файле.
Кодировки, используемые на основе флага ccs и BOM
| Флаг ccs | Нет метки BOM (или новый файл) | BOM: UTF-8 | BOM: UTF-16 |
|---|---|---|---|
| UNICODE | UTF-16LE | UTF-8 | UTF-16LE |
| UTF-8 | UTF-8 | UTF-8 | UTF-16LE |
| UTF-16LE | UTF-16LE | UTF-8 | UTF-16LE |
В файлы, открытые для записи в режиме Юникода, метка BOM записывается автоматически.
Если mode значение имеет некоторое encoding значение, fopen сначала пытается a, ccs=encoding открыть файл с помощью доступа на чтение и запись. Если это действие выполнено успешно, функция считывает BOM, чтобы определить кодировку для файла. Если он завершается ошибкой, функция использует кодировку по умолчанию для файла. В любом случае fopen повторно открывает файл с помощью доступа только для записи. (Это поведение применяется только к режиму «a» , а не к режиму «a+» .)
Сопоставления подпрограмм универсального текста
| TCHAR.H Обычной | _UNICODE и _MBCS не определен | _MBCS Определенные | _UNICODE Определенные |
|---|---|---|---|
| _tfopen | fopen | fopen | _wfopen |
Символьная строка mode указывает тип доступа, который запрошен для файла, следующим образом.
| mode | Открыть |
|---|---|
| «r» | Открывает для чтения. Если файл не существует или не удается найти, вызов завершается ошибкой fopen . |
| «w» | Открывает пустой файл для записи. Если указанный файл существует, его содержимое удаляется. |
| «a» | Открывается для записи в конце файла (добавление) без удаления маркера в конце файла (EOF) перед записью новых данных в файл. Создает файл, если он не существует. |
| «r+» | Открывает для чтения и записи. Файл должен существовать. |
| «w+» | Открывает пустой файл для чтения и записи. Если файл существует, его содержимое удаляется. |
| «a+» | Открывается для чтения и добавления. Операция добавления включает удаления маркера EOF перед записью новых данных в файл. Маркер EOF не восстанавливается после завершения записи. Создает файл, если он не существует. |
Если файл открывается с помощью типа доступа «a» или «a+» , все операции записи выполняются в конце файла. Указатель файла может быть перемещен с помощью fseek или rewind , но он всегда возвращается в конец файла перед выполнением любой операции записи. Поэтому существующие данные не могут быть перезаписаны.
Режим «a» не удаляет маркер EOF перед добавлением в файл. После добавления команда MS-DOS TYPE отображает данные только до первоначального маркера EOF и не отображает данные, добавленные в файл. Перед добавлением в файл режим «a+» удаляет маркер EOF. После добавления команда TYPE MS-DOS отображает все данные в файле. Этот «a+» режим необходим для добавления в потоковый файл, который завершается маркером CTRL + Z EOF.
Если задан тип доступа «r+» , «w+» или «a+» , чтение и запись разрешены (считается, что файл открыт для обновления). Однако при переходе от чтения к записи операция ввода должна получить маркер конца файла. Если EOF отсутствует, необходимо использовать промежуточный вызов функции размещения файлов. Функции размещения файла — fsetpos , fseek и rewind . При переходе от записи к чтению необходимо воспользоваться промежуточным вызовом функции fflush или функции размещения файла.
В дополнение к указанным ранее значениям можно добавить в mode следующие символы, чтобы задать режим перевода для символов новой строки.
| mode Модификатор | Режим перевода |
|---|---|
| t | Откройте файл в текстовом (переведенном) режиме. Сочетания канала возврата каретки (CR-LF) превратятся в однострочные каналы (LF) для входных данных и символов LF превратятся в сочетания CR-LF для выходных данных. Кроме того, при вводе символ CTRL+Z интерпретируется как символ конца файла. |
| b | Откройте в двоичном (нетрансляционном) режиме; переводы, включающие символы канала каретки и строки, подавляются. |
В текстовом режиме CTRL +Z интерпретируется как символ EOF для входных данных. В файлах, открытых для чтения и записи, с помощью «a+» fopen проверка Z CTRL + в конце файла и удаляет его, если это возможно. Он удаляется из-за использования fseek и ftell перемещения в файл, который заканчивается CTRL +Z, может привести fseek к неправильному ведении в конце файла.
В текстовом режиме сочетания канала возврата каретки (CRLF) превратятся в символы однострочного канала (LF) во входных данных, а символы LF переводятся в сочетания CRLF для выходных данных. Если функция ввода-вывода потока Юникода работает в текстовом режиме (по умолчанию) исходный или конечный поток рассматривается как последовательность многобайтовых символов. Поэтому входные функции потока Юникода преобразуют многобайтовые символы в расширенные (как если бы для этого вызывалась функция mbtowc ). По той же причине выходные функции потока Юникода преобразуют расширенные символы в многобайтовые (как если бы для этого вызывалась функция wctomb ).
Если t или b нет mode , режим перевода по умолчанию определяется глобальной переменной _fmode . Если символ t или b указан как префикс аргумента, функция завершается с ошибкой и возвращает NULL .
Дополнительные сведения об использовании текстовых и двоичных режимов в Юникоде и многобайтовом потоке ввода-вывода см. в разделе «Текстовый и двоичный режим» файлов ввода-вывода и потока Юникода в текстовых и двоичных режимах.
Чтобы указать больше поведения, можно добавить mode следующие параметры.
| mode Модификатор | Поведение |
|---|---|
| x | Принудительно принудить функцию завершиться ошибкой, если filename она уже существует. Можно использовать только с описателями w или w+. |
| c | Включите флажок фиксации для связанного объекта filename , чтобы содержимое файлового буфера записывалось непосредственно на диск при вызове fflush или _flushall . |
| n | Сброс флага фиксации для связанного filename с «no-commit». Этот флаг по умолчанию. Оно также переопределяет глобальный флаг фиксации при соединении программы с COMMODE.OBJ. Флаг глобальной фиксации по умолчанию — «без фиксации», если вы явно не связываете программу с COMMODE. OBJ (см . параметры ссылки). |
| N | Указывает, что файл не наследуется дочерними процессами. |
| S | Указывает, что кэширование оптимизировано для последовательного доступа с диска, но не ограничивается им. |
| R | Указывает, что кэширование оптимизировано для случайного доступа с диска, но не ограничивается им. |
| T | Указывает файл, который не записывается на диск, если это не требуется. |
| D | Указывает временный файл, который удаляется при закрытии последнего указателя файла. |
| ccs=encoding | Задает закодированный набор символов, используемый (один из UTF-8 , UTF-16LE или UNICODE ) для этого файла. Не указывайте никакое значение, если требуется использовать кодировку ANSI. Этот флаг отделяется от флагов, предшествующих запятой ( , ). Пример: FILE *f = fopen(«newfile.txt», «rt+, ccs=UTF-8»); |
Допустимые символы mode строки, которая используется fopen и _fdopen соответствует oflag аргументам, используемым _open и _sopen следующим образом.
| Символы в строке mode | Эквивалентное значение oflag для _open / _sopen |
|---|---|
| a | _O_WRONLY | _O_APPEND (обычно _O_WRONLY | _O_CREAT | _O_APPEND ) |
| a+ | _O_RDWR | _O_APPEND (обычно _O_RDWR | _O_APPEND | _O_CREAT ) |
| r | _O_RDONLY |
| r+ | _O_RDWR |
| w | _O_WRONLY (обычно _O_WRONLY | _O_CREAT | _O_TRUNC ) |
| w+ | _O_RDWR (обычно _O_RDWR | _O_CREAT | _O_TRUNC ) |
| b | _O_BINARY |
| t | _O_TEXT (переведено) |
| x | _O_EXCL |
| c | None |
| n | None |
| S | _O_SEQUENTIAL |
| R | _O_RANDOM |
| T | _O_SHORTLIVED |
| D | _O_TEMPORARY |
| ccs=UNICODE | _O_WTEXT |
| * ccs=UTF-8* | _O_UTF8 |
| ccs=UTF-16LE | _O_UTF16 |
Если вы используете rb режим, вам не нужно переносить код, и если вы ожидаете читать большую часть большого файла или не обеспокоены производительностью сети, вы также можете рассмотреть, следует ли использовать сопоставленные с памятью файлы Win32 в качестве параметра.
Относительно T и D :
- T избегает записи файла на диск до тех пор, пока не требуется давление на память. Дополнительные сведения см. в разделе FILE_ATTRIBUTE_TEMPORARY «Константы атрибутов файла», а также в этой записи блога Только временный.
- D указывает обычный файл, записанный на диск. Разница заключается в том, что он автоматически удаляется при закрытии. Вы можете объединить оба TD семантики.
a0/>, n , t T S R и D mode параметры — это расширения Майкрософт для fopen и _wfopen не должны использоваться, если требуется переносимость ANSI.
Требования
| Функция | Обязательный заголовок |
|---|---|
| fopen | |
| _wfopen | или |
_wfopen является расширением Майкрософт. Дополнительные сведения о совместимости см. в разделе Совместимость.
c Для R n mode T S D t и не следует использовать расширения fopen _fdopen Майкрософт , и параметры, в которых необходимо переносить ANSI.
Пример 1
Следующая программа открывает два файла. Она использует fclose для закрытия первого файла и _fcloseall для закрытия всех остальных файлов.
// crt_fopen.c // compile with: /W3 // This program opens two files. It uses // fclose to close the first file and // _fcloseall to close all remaining files. #include FILE *stream, *stream2; int main( void ) < int numclosed; // Open for read (will fail if file "crt_fopen.c" does not exist) if( (stream = fopen( "crt_fopen.c", "r" )) == NULL ) // C4996 // Note: fopen is deprecated; consider using fopen_s instead printf( "The file 'crt_fopen.c' was not opened\n" ); else printf( "The file 'crt_fopen.c' was opened\n" ); // Open for write if( (stream2 = fopen( "data2", "w+" )) == NULL ) // C4996 printf( "The file 'data2' was not opened\n" ); else printf( "The file 'data2' was opened\n" ); // Close stream if it is not NULL if( stream) < if ( fclose( stream ) ) < printf( "The file 'crt_fopen.c' was not closed\n" ); >> // All other files are closed: numclosed = _fcloseall( ); printf( "Number of files closed by _fcloseall: %u\n", numclosed ); >
The file 'crt_fopen.c' was opened The file 'data2' was opened Number of files closed by _fcloseall: 1
Пример 2
Следующая программа создает файл (или перезаписывает его, если имеется) в текстовом режиме с кодировкой Юникода. Затем она записывает две строки в файл и закрывает его. Выходные данные — это файл с именем _wfopen_test.xml , который содержит данные из выходного раздела.
// crt__wfopen.c // compile with: /W3 // This program creates a file (or overwrites one if // it exists), in text mode using Unicode encoding. // It then writes two strings into the file // and then closes the file. #include #include #include #include #define BUFFER_SIZE 50 int main(int argc, char** argv) < wchar_t str[BUFFER_SIZE]; size_t strSize; FILE* fileHandle; // Create an the xml file in text and Unicode encoding mode. if ((fileHandle = _wfopen( L"_wfopen_test.xml",L"wt+,ccs=UNICODE")) == NULL) // C4996 // Note: _wfopen is deprecated; consider using _wfopen_s instead < wprintf(L"_wfopen failed!\n"); return(0); >// Write a string into the file. wcscpy_s(str, sizeof(str)/sizeof(wchar_t), L"\n"); strSize = wcslen(str); if (fwrite(str, sizeof(wchar_t), strSize, fileHandle) != strSize) < wprintf(L"fwrite failed!\n"); >// Write a string into the file. wcscpy_s(str, sizeof(str)/sizeof(wchar_t), L" "); strSize = wcslen(str); if (fwrite(str, sizeof(wchar_t), strSize, fileHandle) != strSize) < wprintf(L"fwrite failed!\n"); >// Close the file. if (fclose(fileHandle)) < wprintf(L"fclose failed!\n"); >return 0; >
Ввод данных из файла и вывод в файл в языке программирования С
До этого при вводе-выводе данных мы работали со стандартными потоками — клавиатурой и монитором. Теперь рассмотрим, как в Си реализовано получение данных из файлов и запись их туда. Перед тем как выполнять эти операции, надо открыть файл и получить доступ к нему.
В языке программирования C указатель на файл имеет тип FILE и его объявление выглядит так:
FILE *myfile;
С другой стороны, функция fopen() открывает файл по указанному в качестве первого аргумента адресу в режиме чтения «r», записи «w» или добавления «a» и возвращает в программу указатель на него. Поэтому процесс открытия файла и подключения его к программе выглядит примерно так:
myfile = fopen("hello.txt", "r");
Примечание. В случае использования относительной адресации текущим/рабочим каталогом в момент исполнения программы должен быть тот, относительно которого указанный относительный адрес корректен. Место нахождения самого исполняемого файла не важно.
При чтении или записи данных в файл обращение к нему осуществляется посредством файлового указателя (в данном случае, myfile ).
Если в силу тех или иных причин (нет файла по указанному адресу, запрещен доступ к нему) функция fopen() не может открыть файл, то она возвращает NULL . В реальных программах почти всегда обрабатывают ошибку открытия файла в ветке if , мы же далее опустим это.
Объявление функции fopen содержится в заголовочном файле stdio.h , поэтому требуется его подключение. Также в stdio.h объявлен тип-структура FILE .
После того, как работа с файлом закончена, принято его закрывать, чтобы освободить буфер от данных и по другим причинам. Это особенно важно, если после работы с файлом программа продолжает выполняться. Разрыв связи между внешним файлом и указателем на него из программы выполняется с помощью функции fclose() . В качестве аргумента ей передается указатель на файл:
fclose(myfile);
В программе может быть открыт не один файл. В таком случае каждый файл должен быть связан со своим файловым указателем. Однако если программа сначала работает с одним файлом, потом закрывает его, то указатель можно использовать для открытия второго файла.
Чтение из текстового файла и запись в него
fscanf
Функция fscanf() аналогична по смыслу функции scanf() , но в отличии от нее осуществляет форматированный ввод из файла, а не стандартного потока ввода. Функция fscanf() принимает параметры: файловый указатель, строку формата, адреса областей памяти для записи данных:
fscanf(myfile, "%s%d", str, &a);
Возвращает количество удачно считанных данных или EOF. Пробелы, символы перехода на новую строку учитываются как разделители данных.
Допустим, у нас есть файл содержащий такое описание объектов:
apples 10 23.4 bananas 5 25.0 bread 1 10.3
Тогда, чтобы считать эти данные, мы можем написать такую программу:
#include int main () { FILE *file; struct food { char name[20]; unsigned qty; float price; }; struct food shop[10]; char i = 0; file = fopen("goods.txt", "r"); while (fscanf(file, "%s%u%f", shop[i].name, &(shop[i].qty), &(shop[i].price)) != EOF) { printf("%s %u %.2f\n", shop[i].name, shop[i].qty, shop[i].price); i++; } }
В данном случае объявляется структура и массив структур. Каждая строка из файла соответствует одному элементу массива; элемент массива представляет собой структуру, содержащую строковое и два числовых поля. За одну итерацию цикл считывает одну строку. Когда встречается конец файла fscanf() возвращает значение EOF и цикл завершается.
fgets
Функция fgets() осуществляет построчный ввод из файла. Один вызов fgets() позволят прочитать одну строку. При этом можно прочитать не всю строку, а лишь ее часть от начала. Параметры fgets() выглядят таким образом:
fgets(массив_символов, количество_считываемых_символов, указатель_на_файл)
fgets(str, 50, myfile)
Такой вызов функции прочитает из файла, связанного с указателем myfile , одну строку текста полностью, если ее длина меньше 50 символов с учетом символа ‘\n’, который функция также сохранит в массиве. Последним (50-ым) элементом массива str будет символ ‘\0’, добавленный fgets . Если строка окажется длиннее, то функция прочитает 49 символов и в конце запишет ‘\0’. В таком случае ‘\n’ в считанной строке содержаться не будет.
#include #define N 80 int main() { FILE *file; char arr[N]; file = fopen("goods.txt", "r"); while (fgets(arr, N, file) != NULL) printf("%s", arr); printf("\n"); fclose(file); }
В этой программе в отличие от предыдущей данные считываются строка за строкой в массив arr . Когда считывается следующая строка, предыдущая теряется. Функция fgets() возвращает NULL в случае, если не может прочитать следующую строку.
getc или fgetc
Функция getc() или fgetc() (работает и то и другое) позволяет получить из файла очередной один символ.
#include #define N 80 int main() { FILE *file; char str[N]; int i; file = fopen("goods.txt", "r"); while ((str[i] = fgetc(file)) != EOF) { if (str[i] == '\n') { str[i] = '\0'; printf("%s\n", str); i = 0; } else i++; } str[i] = '\0'; printf("%s\n",str); fclose(file); }
Приведенный в качестве примера код выводит данные из файла на экран.
Запись в текстовый файл
Также как и ввод, вывод в файл может быть различным.
- Форматированный вывод. Функция fprintf( файловый_указатель, строка_формата, переменные ) .
- Построчный вывод. Функция fputs( строка, файловый_указатель ) .
- Посимвольный вывод. Функция fputc() или putc( символ, файловый_указатель ) .
Ниже приводятся примеры кода, в которых используются три способа вывода данных в файл.
Запись в каждую строку файла полей одной структуры (прерывание в Linux ‒ Ctrl + D ):
#include #define N 80 int main() { FILE *file; char str[N]; int i; file = fopen("goods.txt", "r"); while ((str[i] = fgetc(file)) != EOF) { if (str[i] == '\n') { str[i] = '\0'; printf("%s\n", str); i = 0; } else i++; } str[i] = '\0'; printf("%s\n",str); fclose(file); }
Построчный вывод в файл ( fputs() , в отличие от puts() сама не помещает в конце строки ‘\n’):
#include int main () { FILE *file; char str[10]; file = fopen("output.txt", "w"); while (scanf("%s", str) != EOF) { fputs(str, file); fputs("\n", file); } fclose(file); }
Пример посимвольного вывода:
#include int main() { FILE *file; char i; file = fopen("output.txt", "w"); while ((i = getchar()) != EOF) fputc(i, file); fclose(file); }
Чтение из двоичного файла и запись в него
С файлом можно работать не как с последовательностью символов, а как с последовательностью байтов. В принципе, с нетекстовыми файлами работать по-другому не возможно. Однако так можно читать и писать и в текстовые файлы. Преимущество такого способа доступа к файлу заключается в скорости чтения-записи: за одно обращение можно считать/записать существенный блок информации.
При открытии файла для двоичного доступа, вторым аргументом fopen() является строка «rb» или «wb».
Тема о работе с двоичными файлами достаточно сложная, для ее изучения требуется отдельный урок. Здесь будут отмечены только особенности функций чтения-записи в файл, который рассматривается как поток байтов.
Функции fread() и fwrite() имеют следующие параметры:
- адрес области памяти, куда данные записываются или откуда считываются,
- размер одного данного какого-либо типа,
- количество считываемых данных указанного размера,
- файловый указатель.
Эти функции возвращают количество успешно прочитанных или записанных данных. Т.е. можно «заказать» считывание 50 элементов данных, а получить только 10. Ошибки при этом не возникнет.
Пример использования функций fread() и fwrite() :
#include #include int main() { FILE *file; char shelf1[50], shelf2[100]; int n, m; file = fopen("shelf1.txt", "rb"); n = fread(shelf1, sizeof(char), 50, file); fclose(file); file = fopen("shelf2.txt", "rb"); m = fread(shelf2, sizeof(char), 50, file); fclose(file); shelf1[n] = '\0'; shelf2[m] = '\n'; shelf2[m+1] = '\0'; file = fopen("shop.txt", "wb"); fwrite(strcat(shelf2, shelf1), sizeof(char), n+m, file); fclose(file); }
Здесь осуществляется попытка чтения из первого файла 50-ти символов. В n сохраняется количество реально считанных символов. Значение n может быть равно 50 или меньше. Данные помещаются в строку. То же самое происходит со вторым файлом. Далее первая строка присоединяется ко второй, и данные сбрасываются в третий файл.
Курс с решением задач:
pdf-версия
Fopen s c как использовать
Доброго времени суток! Думаю где-то уже отвечали на такое но гугиль найти такое не помог. Нужно получить полный путь к файлу, переданный в качестве параметра командной строки, и использовать его для открытия файла и дальнейших манипуляций.
Вот мой кодец:
#include "stdafx.h" #include #include #include #include #include #include #include #include int _tmain(int argc, _TCHAR* argv[]) < setlocale(LC_ALL,"RUS"); SetConsoleCP(1251); SetConsoleOutputCP(1251); char *s,*s1,sc[7]; s=(char*)argv[1]; int i=0; CharToOem(argv[1],s1); while(s1[i]!=0)< printf("%c %i\n",s1[i],s1[i]); i++; >FILE *f=fopen(s1,"r"); if(f!=NULL) < fscanf(f,"s",sc); printf("%s",sc); >else < printf("NO"); >//[/преобразуем используя CharToOem] _getch(); for(int t=1;t printf("\n"); i+=2; > //[/вручную просматриваем _tchar: там четные поля-символы, нечетные, видимо, номера кодовых страниц] _getch(); return 0; >
т.е. нужно в любом случае изменять код русских символов, чтобы fopen могла их воспринимать.
ps вторую часть вывел сам; странно что CharToOem сразу не делает все хорошо;
вопщем вопрос такой: как? что? почему? можно сделать все хорошо и красиво
psps наличие или отсутствие следующих строчек на функционирование не повлияло
setlocale(LC_ALL,»RUS»);
SetConsoleCP(1251);
SetConsoleOutputCP(1251);