我需要创建一个C程序(我正在使用Xcode),它读取一个文件并将第一行分隔成4个不同的变量。
我有一个名为“network”的typedef结构:

typedef struct {
    int a, b, c, d;
    char op_sys[10];
} network;

我还有一个文件,其中包含IP地址列表及其操作系统。
例如,第一行是:192.116.112.1 windows
我想扫描第一行,然后:
a = 192
b = 116
c = 112
d = 1
op_sys = "windows"

然后转到下一行,做同样的事。。
知道怎么做吗?任何建议都很好!!!
我正在一步一步地尝试。它正在读取文件并打印它,我只是不知道如何将它分离成单独的变量。
int main(void)
{
    FILE *input;
    char s[25];

    input = fopen("inputfile.txt", "r");

    while(fgets(s, 25, input) != NULL)
    {
        printf("%s\n", s);
    }
    return 0;
}

最佳答案

这里有一个简单的实现:

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

#define SIZE 10 // Max length (including NULL character at the end) of op_sys field

typedef struct {
   int a, b, c, d;
   char op_sys[SIZE];
} network;

int main(int argc,char *argv[])
{
    FILE *input;
    char s[16+SIZE+1];  // This will contain a line from the text file. (16+SIZE+1) is the max length possible for a line.
                        // 16 for IP address, SIZE for the OS name and 1 for the NULL character.
    network net;
    char *token=NULL;
    char delim[]={'.',' ','\n','\0'};   // Delimiters used to divide each line in tokens

    input = fopen("inputfile.txt", "r");

    while(fgets(s,(16+SIZE+1),input)!=NULL)
    {
      token=strtok(s,delim);        // We get the first octet of the address
      net.a=atoi(token);
      token=strtok(NULL,delim);     // We get the second octet of the address
      net.b=atoi(token);
      token=strtok(NULL,delim);     // We get the third octet of the address
      net.c=atoi(token);
      token=strtok(NULL,delim);     // We get the fourth octet of the address
      net.d=atoi(token);
      token=strtok(NULL,delim);     // We get the OS name...
      char *ptr=net.op_sys;
      ptr=strncpy(ptr,token,SIZE);  // ... and we copy it in net.op_sys
      ptr[SIZE-1]='\0';
      printf("%3d.%3d.%3d.%3d\t\t%s\n",net.a,net.b,net.c,net.d,net.op_sys);     // We print the values of all the fields
    }

    fclose(input);

    return 0;
}

记住,这个实现不会检查行的格式是否正确,也不会检查操作系统名称的长度是否大于大小。我把那种支票留给你。

09-08 00:10