-2

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

w 7b034d90
r 7b034c68
r df84d4

如何读取第一个字符并将其存储到变量中,第二个字符存储在另一个变量中?这必须对多行输入进行。例如,我需要将 w 存储到 variableA和 7b034d90 到 variable 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);

    }
}
4

3 回答 3

0

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

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。

于 2013-09-26T01:46:19.347 回答
0

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

于 2013-09-26T02:00:53.263 回答
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;  
        }
    }  
}
于 2013-09-26T00:00:04.510 回答