-1

私はCでこれをやろうとしています.Pythonでいくつかのコードを持っていますが、Cでそれを機能させる方法がわかりません.高級言語に慣れています.Cは私にとって本当に初めてです.どこから始めればいいのかわからないので、翻訳を手伝ってください...

Python コード:

archivo = open('passwd.txt')
for linea in archivo:
        campos = linea.strip().split(':')
        print 'User',campos[0],'has shell',campos[6]
archivo.close()

passwd.txt は次のとおりです。

root:x:0:0:root:/root:/bin/bash
daemon:x:1:1:daemon:/usr/sbin:/bin/sh
bin:x:2:2:bin:/bin:/bin/sh

出力は次のようになります。

User root has shell /bin/bash
User daemon has shell /bin/sh
User bin has shell /bin/sh

誰でも私を助けることができますか?

4

4 に答える 4

1

かなり複雑ですが、基本的に知っておくべき重要なことが 2 つあります。それらを使用してやりたいことを行う方法を説明するつもりはありませんが、それらをどのように使用できるかを示すだけです。

1 つ目は、ファイルを 1 行ずつ読み取ることです。これは次のように行うことができます: ( Source )

FILE *file = fopen ( filename, "r" );
char line [ 128 ]; /* or other suitable maximum line size */
while ( fgets ( line, sizeof line, file ) != NULL ) /* read a line */
{
  fputs ( line, stdout ); /* write the line */
}
fclose ( file );

2 つ目は、行を解析することです。ここでの最適なツールはstrtok. (例のソース

 const char string[] = "words separated by spaces -- and, punctuation!";
 const char delimiters[] = " .,;:!-";
 char *token, *cp;

 ...

 cp = strdupa (string);                /* Make writable copy.  */
 token = strtok (cp, delimiters);      /* token => "words" */
 token = strtok (NULL, delimiters);    /* token => "separated" */
 token = strtok (NULL, delimiters);    /* token => "by" */
 token = strtok (NULL, delimiters);    /* token => "spaces" */
 token = strtok (NULL, delimiters);    /* token => "and" */
 token = strtok (NULL, delimiters);    /* token => "punctuation" */
 token = strtok (NULL, delimiters);    /* token => NULL */

この 2 つを組み合わせて、適切なノードを取得する方法を見つければ、準備完了です。幸運を!

于 2012-12-07T01:57:10.820 に答える
0

私の知る限り、C でファイルを操作する必要がある場合は、fopen() を使用してテキストを開くことができます。 http://msdn.microsoft.com/en-us/library/yeby3zcb%28v=VS.71%29.aspx また、「EOF」を使用してすべてのトークンを取得できます。ちょうどこのような:

while(gets() != EOF)

したがって、すべての行の int テキストを取得し、それを文字列に保存するだけで、printf で問題ありません。

于 2012-12-07T01:58:44.710 に答える
0
#include <stdio.h>
#include <string.h>

int main(void) {
   FILE *fp = fopen("/etc/passwd", "r");
   char line[999];
   while (fgets(line, sizeof line, fp)) {
      char *user = strtok(line, ":");
      char *shell;
      int i;
      for (i = 0; i < 4; i++)
         strtok(0, ":");
      shell = strtok(0, ":");
      printf("User %s has shell %s\n", user, shell);
   }
   fclose(fp);
   return 0;
}

However, if /etc/passwd has empty fields, indicated by ::, then strtok will not work. You could use strsep instead, or just strchr, as in:

#include <stdio.h>
#include <string.h>

int main(void) {
   FILE *fp = fopen("/etc/passwd", "r");
   char line[999];
   while (fgets(line, sizeof line, fp)) {
      char *user = line;
      char *p = line;
      char *shell;
      int i;
      for (i = 0; i < 6; i++)
         p = strchr(p + 1, ':');
      shell = p + 1;
      strchr(user, ':')[0] = 0;
      printf("User %s has shell %s", user, shell);
   }
   fclose(fp);
   return 0;
}

On my machine, some of the so-called GECOS fields are empty, and user news has no shell.

于 2012-12-07T02:05:02.867 に答える