Como crear un Linux equivalente “nl” de comandos mediante llamadas al sistema en C? [cerrado]

StackOverflow https://stackoverflow.com/questions/753491

  •  09-09-2019
  •  | 
  •  

Pregunta

Tengo un ejercicio que hacer donde tengo que codificar en C, los comandos equivalente a cat y nl utilizando sólo las llamadas al sistema. Las llamadas al sistema que se nos están abiertas (), close (), read () y write ().

Ya he hecho el "gato" equivalente y parece estar funcionando bien, ahora tengo que hacer el "nl" uno pero estoy teniendo problemas con cómo voy a escribir línea por línea.

La idea es utilizar el sistema llama a menos posible.

Sé que necesito para encontrar el '\ n' en la memoria intermedia y no pude hacer un tiempo para recorrer la memoria intermedia y encontrar la posición '\ n' (llamémosle X) y luego escribir un número X de bytes a la salida estándar .

Pero bucle a través de todos los caracteres de la memoria intermedia en busca de la final de la línea no se siente bien para mí, pero no tengo ni idea de qué otra manera podría hacer esto ...

EDITAR IMPORTANTE:
Creo que algunos de ustedes están perdiendo el punto de mi pregunta ... No necesito explicaciones sobre cómo hacer esto, que no es mi problema. Yo sé cómo hacerlo (o tener una muy buena idea, yo no lo he probado todavía). El "problema" es que no se siente bien para recorrer la memoria intermedia, archivo o lo que sea, char por char, para encontrar el final de la línea (no importa cómo). No estoy diciendo que esto no es la respuesta o que no se me permite hacer esto y lo otro, sólo estoy hablando de lo que pienso. Sólo parece una extraña manera de hacer esto, eso es todo ... Pero si eso es cierto, que esa es la respuesta a mi pregunta.

Me apprecite la ayuda de todos sin embargo:)

¿Fue útil?

Solución

Usted tendrá que buscar en la memoria intermedia de \n, no hay manera de evitarlo. No se preocupe por el rendimiento, la progam pasará la mayor parte del tiempo en read y write.

Además, asegúrese de que usted hace el buffer lo suficientemente grande. No llame read(file,&c,1), ya que será muy lenta.

Otros consejos

La única manera de encontrar un '\ n' es la búsqueda de la misma. Si no puede utilizar strchr(3), usted tiene que iterar sobre el buffer para encontrar lo que estás buscando. (Léase: implementarlo)

Si no conoces las longitudes de las líneas de antelación, no hay ningún atajo para encontrar el lugar de la \ n. Es decir, a menos que utilice una función implementada fácilmente para dividir las líneas, pero que probablemente acaba de hacer lo mismo en algún lugar de la línea.

Es decir, sí, hay que colocar a través de los caracteres:)

Un esquema muy aproximado:

  • Puede reemplazar getc(file) con read(file,&c,1): acaba de escribir una función que acepta el archivo como un argumento y devuelve un carácter. Lea el personaje en un ariable local y devolverlo.

  • A continuación, poner en práctica un getline(file): Hacer un tampón, a partir caracteres de lectura en él uno a la vez, deja cuando se llega a '\n' (? ¿Qué vas a hacer si queda sin espacio), y devolver un puntero a la memoria intermedia (¿Cómo se puede asignar el almacenamiento intermedio para que esto funcione?).

  • El uso que getline para leer una línea a la vez, a continuación, escribir el número de línea y la línea.

  • Bucle hasta que se le acaba el archivo ...


Para hacer menos llamadas al sistema:

Leer todo el archivo en un buffer de gran tamaño de una sola vez --- Eso es bastante fácil si usted tiene el tamaño del archivo --- y caminar es un carácter a la hora de encontrar la línea comienza y termina (utilizar dos punteros).

En realidad no necesita saber la ubicación de la '\n' numerar las líneas. Que acaba de imprimir el número de línea (empezando por 1), y lee caracteres hasta llegar a un '\n nueva línea'. Copiar cada personaje de nuevo a la salida estándar con write(), y si el carácter es un carácter de nueva línea, incremente el conteo de líneas y de impresión actuales que fuera, también.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top