如何读取文件的每一行并使用C将其存储在单独的变量中?

时间:2013-09-25 23:12:15

标签: c

我的输入文件包含以下内容:

w 7b034d90
r 7b034c68
r df84d4

如何将第一个字符读入并存储到变量中,将第二个字符存储在另一个变量中?必须对几行输入进行此操作。 例如,我需要将变量A和7b034d90存储到变量B中。这必须在几千行中完成,每行的第一个字符将是w或r。解决这个问题的最佳方式是什么?

这是我的代码:

struct MemBlock
{
    char address
    char ReadorWrite;
};

struct MemBlock blocks[100]


int main (int argc, char *argv[])
{
    int line = 0;


    static const char filename[] = "sampleTest.txt";
    FILE *file = fopen ( filename, "r" );


    if (fp == NULL)
    {
        printf ("Error opening the file\n\n'");
        exit(EXIT_FAILURE);
    } else {

        if (argc == 3)
        {
         for (i=0,i<100,i++)
         {
             while ( fgets ( line, sizeof line, file ) != NULL ) 
          {
             r = fscanf(fp, "%s %s\n", blocks[i].ReadOrWrite, blocks[i].address);
             line++;
          }
         }


    fclose(fp);

    }
}

3 个答案:

答案 0 :(得分:0)

如果您不知道有多少对,则需要通过某种机制跟踪它们。一个是malloc并将它们链接到一个列表中。为此,请添加指向结构的指针。

所以流程将类似于下面的伪代码。它需要结构定义,错误代码,API文件调用是正确的,并确保链接列表是正确的。

struct Memblock head;  
struct Memblock *oldp = &head;
main() {  
    fp = fopen(file);  
    while (fgets(line, fp, sizeof(line)-1) != NULL) {  
        if (sscanf(line, "%c %d", &flag, &address) == 2) {  
            sp = malloc(sizeof(struct));  
            sp->flag = flag;  
            sp->address = address;    
            sp->next = NULL;
            oldp->next = sp;  
        }
    }  
}

答案 1 :(得分:0)

让我们假设OP在完成时想要一个struct MemBlock数组

C伪代码(省略错误处理)

struct MemBlock {
  unsigned long address;   // Data is obviously hexadecimal
  char ReadorWrite;
};

FILE *inf = fopen(filename, "rt");  // Use "rt"
size_t line = 0;
char buffer[1+1+16+2+100]; // big enough for expected letter and number + change
while (fgets(buf, sizeof buf, inf) != NULL) line++;
frewind(inf);
struct MemBlock *Array = calloc(line, sizeof *Array);
for (size_t i = 0; i< line; i++) {
  if (fgets(buf, sizeof buf, inf) != NULL)) handle error
  if (2 !=sscanf("%c%lx", &Array[i].ReadorWrite, &Array[i].address)) handle error
}
fclose(inf);
// Use Array[] with length `line`.
...
free(Array)

我喜欢一遍链接列表的想法,但想提供另一个POV。

答案 2 :(得分:0)

有两种方法,例如sscanf()或使用strchr()或c ++,类似http://www.boost.org/doc/libs/1_54_0/libs/filesystem/example/tut3.cpp