>> ALTAVOZ: Hasta el momento, lo más probable que la mayoría de sus programas
han sido un poco efímero.
Ejecutar un programa como Mario o codicioso.
Lo hace algo, tal vez le pide el usuario alguna información,
imprimir alguna salida a la pantalla, pero luego cuando el programa ha terminado,
no hay realmente ninguna evidencia existe Alguna vez se ha ejecutado en el primer lugar.
Quiero decir, claro, que podría haber dejado se abre en la ventana de terminal,
pero si se borra la pantalla, hay Realmente no hay evidencia de que existió.
No tenemos un medio de almacenamiento información persistente, la información
que existe después de nuestra programa ha dejado de funcionar,
o nosotros no tenemos hasta este punto.
Afortunadamente, sin embargo, hace c nos proporcionan la capacidad
para hacer esto mediante la implementación algo que se llama
un archivo, una estructura que básicamente representa un archivo que quieres duplicar
haga clic en el equipo, si estás utilizado para un entorno gráfico de usuario.
Generalmente cuando se trabaja con c, en realidad estamos
va a estar trabajando con punteros a archivos-- archivo stars--
a excepción de un poco cuando hablamos de un par
de las funciones que trabajar con punteros de archivos.
Usted no tiene que realmente han cavado demasiado profundo en la comprensión de los punteros
sí mismos.
Hay un poco de pequeñísima donde vamos a hablar de ellos,
pero generalmente presentar punteros y punteros, mientras que están relacionados entre sí,
no son exactamente lo mismo.
>> Ahora, ¿qué quiero decir cuando Digo datos persistentes?
Qué son los datos persistentes?
¿Por qué nos importa eso?
Decir, por ejemplo, que se está ejecutando un programa de
o que haya reescrito una programa que es un juego,
y desea hacer un seguimiento de todos los movimientos del usuario
de manera que tal vez si algo sale mal, puede revisar el archivo después del partido.
Eso es lo que queremos decir cuando hablar de datos persistentes.
>> En el curso de la ejecución de su programa, se crea un archivo.
Y cuando su programa ha dejado de funcionar,
ese archivo aún existe en el sistema.
Y podemos verlo y examinarlo.
Y para que el programa se establece en han creado algunos datos persistentes,
existen datos después del programa ha terminado de ejecutarse.
>> Ahora todas estas funciones que trabajan con la creación de archivos y la manipulación
de diversas formas vivir en io.h estándar,
que es un archivo de cabecera que probablemente has estado libras
incluyendo en la parte superior de bastante mucho todos tus programas
porque contiene una de las la mayoría de funciones útiles para nosotros,
printf, que también permite vive en io.h. estándar
Así que usted no tiene que golpear incluye los archivos adicionales, probablemente,
con el fin de trabajar con los punteros de archivos.
>> Ahora, cada función de puntero solo archivo, o de E / S, la salida de entrada cada archivo que he
función, acepta como uno de sus parámetros o entradas
un pointer-- archivo excepto para uno, fopen, que
es lo que se utiliza para obtener el archivo puntero en el primer lugar.
Pero después de haber abierto la archiva y se obtiene apuntadores de archivo,
a continuación, puede pasar a ellos como argumentos a las diversas funciones
vamos a hablar acerca de Hoy en día, así como muchos otros
para que pueda trabajar con archivos.
>> Así que hay seis bonita los básicos comunes
que vamos a hablar hoy.
fopen y su compañera función fclose, fgetc
y su función compañero fputc, y fread y su función compañero,
fwrite.
Así que vamos a tener derecho a ella.
>> fopen-- qué hace?
Bueno, se abre un archivo y le da un apuntador de archivo a la misma,
de modo que usted puede utilizar ese presentar puntero como argumento
a cualquiera de las otras funciones de E / S de archivos.
Lo más importante para recordar con fopen
es que después de haber abierto la presentar o hecho una llamada como el que aquí,
es necesario comprobar para asegurarse que el puntero que volviste
no es igual a null.
Si no has visto el video en punteros, esto podría no tener sentido.
Pero si usted trata de eliminar la referencia un retiro de puntero nulo,
su programa probablemente sufrirán una segmentación [inaudible].
Queremos asegurarnos de que nos dieron una vuelta puntero legítimo.
La gran mayoría de las veces lo haremos han conseguido un puntero legítima vuelta
y no va a ser un problema.
>> Entonces, ¿cómo hacemos una llamada a fopen?
Se ve muy parecido a esto.
Estrella Archivo ptr-- ptr es un genérico nombre de archivo pointer-- fopen
y se pasa en dos cosas, un nombre de archivo y una operación que queremos llevar a cabo.
Así que puede ser que tengamos una llamada que se parece a esto-- ptr estrella archivo 1 es igual a fopen
file1.txt.
Y la operación que he elegido es r.
>> Entonces, ¿qué cree usted que r es aquí?
¿Cuáles son los tipos de cosas que podría ser capaz de hacer a los archivos?
Así que r es la operación que nos elegir cuando queremos leer un archivo.
Así que, básicamente, cuando hacemos una llamada como esta
estar recibiendo nosotros un apuntador de archivo de tal manera que pudiéramos luego leer la información
desde file1.txt.
>> Del mismo modo, podríamos abrir el archivo 2.txt para escribir y para que podamos pasar ptr2,
el puntero del archivo que he creado aquí, como argumento para cualquier función que
escribe información en un archivo.
Y al igual que la escritura, hay También la opción de anexar, a.
La diferencia entre escritura y añadiendo
es que cuando se escribe en un archivo, si usted hace una llamada a fopen para la escritura
y ya existe ese archivo, que es va a sobrescribir el archivo completo.
Esto va a empezar Al principio,
borrando toda la información eso es ya allí.
>> Mientras que si la abres para anexar, irá a la final del archivo
si ya hay texto en o la información en él,
y continuación, se iniciará escribir desde allí.
Así que usted no perderá ninguno de los la información que has hecho antes.
Tanto si desea escribir o anexar tipo de depende de la situación.
Pero usted probablemente sabe lo que el el funcionamiento adecuado es cuando llegue el momento.
Así que eso es fopen.
>> ¿Qué pasa con fclose?
Bueno, bastante simple, fclose Sólo acepta el puntero de archivo.
Y como era de esperar, que cierre ese archivo.
Y una vez que hemos cerrado un archivo, no podemos realizar más funciones de archivo de E / S,
leer o escribir, en ese archivo.
Tenemos que volver a abrir la presentar otra vez con el fin
seguir trabajando con usando las funciones de E / S.
Medios Así fclose hemos terminado trabajar con este archivo.
Y todo lo que necesitamos para pasar en es el nombre de un apuntador de archivo.
Así que en un par hace desliza, nos fopened archivo de texto 1 punto para la lectura
y asignamos que presentar puntero a ptr1.
Ahora hemos decidido que estamos hecho la lectura de ese archivo.
Nosotros no tenemos que hacer nada más con ella.
Podemos ptr1 simplemente fclose.
Y de manera similar, que podría fclose los otros.
Correcto.
Así que ha de abrir y cerrar.
Esos son los dos básica iniciar operaciones.
>> Ahora queremos realidad hacer algunas cosas interesantes,
y la primera función que vamos a ver que va a hacer es fgetc--
presentar obtener un carácter.
Eso es lo que fgetc general se traduciría en.
Su objetivo en la vida es leer el siguiente carácter,
o si este es su muy primera llamada a fgetc
para un archivo en particular, el primer carácter.
Pero entonces después de eso, se obtiene la siguiente,
el siguiente carácter de ese archivo, y la almacena en una variable de carácter.
Como lo hemos hecho aquí, char ch equivale fgetc,
Aconteció en el nombre de un apuntador de archivo.
Una vez más, es muy importante aquí recordar
que con el fin de tener esta operación tenga éxito,
el puntero del propio archivo Debió haber ha abierto para lectura.
No podemos leer un personaje de un archivo puntero que abrimos para la escritura.
Así que esa es una de las limitaciones de fopen, ¿verdad?
Tenemos que restringir nosotros mismos sólo para realizar
una operación con un puntero de archivo.
Si quisiéramos leer y escribir desde el mismo archivo,
tendríamos abierto sendos apuntadores de archivo a la misma file--
uno para la lectura, uno para la escritura.
>> Así que de nuevo, la única razón Traigo que hasta ahora es
porque si vamos a hacer una llamada a fgetc, que debe de haber apuntador de archivo
ha abierto para lectura.
Y entonces bastante simple, todo lo que necesitamos hacer
es pasar en el nombre del fichero apuntado.
Así char ch equivale ptr1 fgetc.
>> Eso va a sacarnos la siguiente character--
o de nuevo, si este es el primero el tiempo que hemos hecho esta llamada,
la primera character-- de cualquier archivo está apuntado por ptr1.
Recordemos que ese era el archivo de texto 1 punto.
Va a llegar el primer carácter de esa y nosotros la almacenamos en la ch variable.
Muy claro.
Así que sólo hemos visto a las tres funciones y ya tenemos
puede hacer algo con buena pinta.
>> Así que si tenemos esta capacidad de conseguir un personaje
y bucle it-- así que continuar recibiendo caracteres
desde un archivo de una y una y over-- ahora
puede leer cada carácter de un archivo.
Y si imprimimos todos los personajes inmediatamente después de la leemos,
ahora hemos leído de un archivo y impresa su contenido a la pantalla.
Hemos concatenados con eficacia ese archivo en la pantalla.
Y eso es lo que el Linux comando cat hace.
>> Si escribe gato en el nombre de archivo, imprimirá todo el contenido
del archivo en la ventana del terminal.
Y así, este pequeño bucle de aquí, sólo tres líneas de código,
pero duplica efectivamente el gato de comandos de Linux.
Así que esta sintaxis podría mirar un poco extraño,
pero esto es lo que está pasando aquí.
Mientras ch equivale fgetc, ptr no es igual a EOF-- es todo un bocado,
pero vamos a romper justo por lo que es claro en la sintaxis.
He consolidó por el bien de espacio,
aunque es un poco sintácticamente complicado.
>> Así que esta parte de la derecha verde ahora, ¿qué está haciendo?
Bueno, eso es sólo nuestra llamada fgetc, ¿verdad?
Hemos visto eso antes.
Es la obtención de uno carácter del archivo.
Luego comparamos que carácter contra EOF.
EOF es un valor especial que es se define en io.h estándar, que
es el carácter de fin de archivo.
Así que básicamente lo que va a pasar este bucle se leerá un personaje,
compararlo con EF, el carácter de fin de archivo.
Si no coinciden, por lo que no tenemos llegado al final del archivo,
vamos a imprimir ese carácter a cabo.
Entonces vamos a ir de nuevo a la principio del bucle de nuevo.
Vamos a llegar a un personaje, comprobamos contra EOF, imprimirlo, etc.
Y así sucesivamente y así sucesivamente, bucle a través de esa manera
hasta que hemos llegado al final del archivo.
Y entonces en ese momento, habremos impresa
a cabo la totalidad del contenido del archivo.
Así que de nuevo, sólo hemos visto fopen, fclose y fgetc
y ya podemos duplicar un comando de terminal de Linux.
>> Como he dicho al principio, tuvimos fgetc y fputc,
y fputc era el compañero función de fgetc.
Y así, como se puede imaginar, es la escritura equivalente.
Se nos permite escribir una solo carácter en un archivo.
>> Una vez más, siendo la salvedad, justo como lo fue con fgetc, el archivo
que estamos escribiendo a debe haber sido abierto para escribir o para anexar.
Si tratamos y utilizamos fputc en un archivo que hemos abierto para la lectura,
vamos a sufrir un poco de un error.
Pero la llamada es bastante simple.
el capital fputc Un ptr2, todo que va a hacer es que es
va a escribir la carta en A en un archivo de 2 puntos
texto, que era el nombre de la archivo que abrimos y asignamos
el puntero a PTR2.
Así que vamos a escribir una A mayúscula al archivo de texto 2 puntos.
Y vamos a escribir una exclamación apuntar a presentar 3 puntos
texto, que fue apuntado por ptr3.
Así que de nuevo, bastante sencillo aquí.
>> Pero ahora podemos hacer otra cosa.
Tenemos este ejemplo solo nos íbamos más
acerca de ser capaz de replicar el gato Comandos de Linux, la que imprime
a la pantalla.
Bueno, ahora que tenemos la capacidad leer caracteres de archivos
y escribir caracteres en archivos, ¿por qué no simplemente sustituimos que
llamar a printf con una llamada a fputc.
>> Y ahora que hemos duplicamos cp, un comando muy básico Linux
que hemos hablado largo camino Hace en el Linux comandos vídeo.
Tenemos efectivamente duplicado que aquí.
Estamos leyendo un personaje y luego estamos escribir ese personaje a otro archivo.
La lectura de un archivo, la escritura a otro, una y otra
y otra vez hasta que golpeamos EOF.
Tenemos hasta el final de la presentar estamos tratando de copiar.
Y con esto habremos escrito todo de los personajes necesitamos el archivo
que estamos escribiendo a.
Así que esto es cp, el comando de copia de Linux.
>> En el comienzo de este video, yo tenía la advertencia
que íbamos a hablar un poco acerca de los punteros.
Aquí está específicamente donde estamos vamos a hablar de punteros
además de presentar punteros.
Así que esta función se ve un poco de miedo.
Tiene varios parámetros.
Hay mucho que hacer aquí.
Hay un montón de diferentes colores y textos.
Pero, en realidad, es sólo el versión genérica de fgetc
que nos permite obtener cualquier cantidad de información.
Puede ser un poco ineficiente si somos obtener caracteres de uno en uno,
iteración a través del archivo un carácter a la vez.
¿No sería mejor para conseguir 100 a la vez o 500 a la vez?
>> Bueno, fread y su función compañero fwrite, lo que vamos a hablar de
en un segundo, nos permiten hacer precisamente eso.
Podemos leer una cantidad arbitraria de información de un archivo
y lo almacenamos en algún lugar temporalmente.
En lugar de ser capaz de simplemente encajar en una sola variable,
que podríamos necesitar para almacenarlo en una matriz.
Así, se pasa de cada cuatro argumentos para fread-- un puntero
a la ubicación donde estamos va a almacenar la información,
lo grande que cada unidad de información será, cuántas unidades de información
queremos adquirir, y desde qué archivo queremos conseguirlos.
Probablemente el mejor ilustrado con un ejemplo aquí.
Así que digamos que declaremos un arreglo de 10 enteros.
Nos hemos declarado en la apilar arbitrariamente int arr 10.
Así que eso es bastante sencillo.
Ahora lo que estamos haciendo, aunque es el frecall es que estamos tamaño de int leyendo
tiempos de 10 bytes de información.
Tamaño de int ser four-- eso es el tamaño de un número entero en c.
>> Así que lo que estamos haciendo es que estamos leyendo 40 bytes por valor de la información
desde el archivo apuntado por ptr.
Y estamos almacenando los 40 bytes en alguna parte
donde hemos reservado 40 bytes por valor de la memoria.
Afortunadamente, ya hemos hecho eso por declarando arr, esa matriz allí mismo.
Eso es capaz de mantener 10 unidades de cuatro bytes.
Así que en total, que puede contener 40 bytes valor de la información.
Y ahora estamos leyendo 40 bytes de la información del archivo,
y estamos almacenarlo en arr.
>> Recordemos el video en punteros que el nombre de una matriz, como arr,
es en realidad un puntero a su primer elemento.
Así que cuando pasamos en arr allí, son, de hecho, pasando en un puntero.
>> Del mismo modo que podemos hacer esto-- No necesariamente
deberá guardar nuestro buffer en la pila.
También podríamos asignar dinámicamente un tampón como este, usando malloc.
Recuerde, cuando asignar dinámicamente memoria,
estamos ahorrando en el montón, no la pila.
Pero sigue siendo un búfer.
>> Todavía, en este caso, es la celebración de 640 bytes de información
porque una doble toma hasta ocho bytes.
Y estamos pidiendo 80 de ellos.
Queremos tener espacio para celebrar 80 dobles.
Así que 80 veces 8 es información de 640 bytes.
Y esa llamada a fread es recogida de 640 bytes de información
desde el archivo apuntado por ptr y almacenar ahora en arr2.
>> Ahora también podemos tratar fread al igual que una llamada a fgetc.
En este caso, sólo estamos tratando de tener un carácter del archivo.
Y no necesitamos un matriz para sostener un personaje.
Sólo podemos almacenarla en una variable de carácter.
>> La captura, sin embargo, es que cuando sólo tenemos una variable,
tenemos que pasar en el dirección de esa variable
porque recuerdo que el primer argumento de fread
es un puntero a la ubicación y la memoria donde queremos almacenar la información.
Una vez más, el nombre de una array es un puntero.
Así que no tenemos que hacer arsenal signo.
Pero c, el carácter c aquí, no es una matriz.
Es sólo una variable.
Y así tenemos que pasar una c ampersand para indicar
que esa es la dirección en la que queremos para almacenar este un byte de información,
éste carácter que estamos recogiendo el ptr.
Fwrite-- voy a ir a través esto un poco más
quickly-- es más o menos la equivalente exacto de fread
excepto que es para la escritura en lugar de leer, simplemente
como el otro-- que hemos tenido abierta y cerca, consiga un carácter,
escribir un personaje.
Ahora es conseguir arbitraria cantidad de información,
cantidad arbitraria derecho de información.
Así que al igual que antes, podemos tener un arreglo de 10 enteros
donde ya tenemos la información almacenada, tal vez.
>> Fue probablemente algunas líneas de código que debe ir entre estos dos
donde lleno yo arr con algo significativo.
Lleno con 10 enteros diferentes.
Y en su lugar, lo que estoy haciendo es escribir desde arr
y la recolección de la información de arr.
Y yo voy a llevar esa información y ponerlo en el archivo.
>> Así que en lugar de que sea de el archivo a la memoria intermedia,
ahora estamos pasando de el buffer en el archivo.
Así que es justo lo contrario.
Así que de nuevo, al igual que antes, podemos también tienen un pedazo montón de memoria
que hemos dinámicamente asignado y leer a partir de ese
y escribir que en el archivo.
>> Y también tenemos una sola variable capaz de contener un byte
de la información, tal como un carácter.
Pero, de nuevo, tenemos que pasar la dirección de esa variable
cuando queremos leer de él.
Así que podemos escribir la información nos encontramos en esa dirección
al puntero de archivo, ptr.
>> Hay un montón de otros funciones de gran archivo de E / S
que hacen varias cosas además los que han hablado de la actualidad.
Un par de los que pueden interesarte
son fgets y fputs, que son el equivalente
de fgetc y fputc pero para la lectura una única cadena de un archivo.
En lugar de un solo carácter, leerá una cadena entera.
fprintf, lo que permite, básicamente, utilizar printf para escribir en el archivo.
Así que al igual que usted puede hacer lo la sustitución de variables utilizando
Los marcadores de posición por ciento iy d ciento, y así sucesivamente, con printf
puede igualmente tomar la cadena printf e imprimir algo
al igual que en un archivo.
>> fseek-- si usted tiene un reproductor de DVD es la analogía que suelen utilizar aquí--
es algo así como el uso de su rebobinado y avance rápido
para mover alrededor de la película.
Del mismo modo, puedes moverte por el archivo.
Una de las cosas en el interior que la estructura de archivos
que c crea para usted es un indicador de dónde se encuentra en el archivo.
¿Está usted en el mismo comenzando, en el byte cero?
¿Está usted en el byte 100, byte de 1000, y así sucesivamente?
Puede utilizar fseek mover arbitrariamente ese indicador hacia adelante o hacia atrás.
>> Y ftell, de nuevo similar a un reproductor de DVD,
es como un pequeño reloj que le dice cuántos minutos y segundos le
están en una película en particular.
Del mismo modo, ftell le dice cómo muchos bytes que están en el archivo.
feof es una versión diferente de detectar si usted tiene
llegado al final del archivo.
Y es una función ferror que se puede utilizar
para detectar si algo tiene ido de trabajo mal con un archivo.
Una vez más, esto es sólo arañar la superficie.
Todavía hay muchos más archivos de E / S funciones en el estándar io.h.
Pero esto probablemente conseguirle comenzado a trabajar con punteros de archivos.
Soy Doug Lloyd.
Esto es CS50.