我试图逐行读取文件,并采用两个单独的字符串,并将它们分配给两个不同的变量。前后会有空白的空白空间。

我得到一个像这样的文件:

EXAMPLE.TXT
===========
company value\n
     company value    \n
company value   \n


<company>之前或<value>之后可以有任何类型的空格字符,但两者之间始终始终只有一个空格。我试图将这些<company><values>放入一个哈希表中。这就是我现在正在做的事情。

hashtable_t * accounts = create_hashtable(lines);
//Inserting into hashtable
while(fscanf(fd, " <%79[^>]> <%lf%*[^\n]", company, &balance) == 2) {
      if(set(accounts, company, balance) == 0) {
            continue;
      } else {
            return NULL;
      }
}

fclose(fd);
return accounts;


我认为我的问题出在while循环的参数中。它返回-1,所以我认为这不是有效的参数。

最佳答案

当到达文件末尾或发生读取错误时,fscanf返回EOF。
由于您的情况是返回-1,因此建议您查看ferror

int err = ferror(fd);
fprintf(stderr, "err %d: %s\n", err, strerror(err));


我对scanf的测试表明它有效:

#include <stdio.h>

int main(void) {
    FILE *fp = fopen("test.txt", "r");
    char line[256];

    int lines = 0;

    while (fgets(line, sizeof line, fp) != NULL)
            ++lines;

    printf("total lines: %d\n", lines);

    fseek(fp, 0, SEEK_SET);

    double balance;
    char company[128] = {'\0'};
    int ret;

    while ((ret = fscanf(fp, " <%[^>]> <%lf>", company, &balance)) == 2) {
            printf("%s: %lf\n", company, balance);
    }
    if (!feof(fp)) {
            fprintf(stderr, "error %d\n", ferror(fp));
    }
    return 0;
}


测试文件:

 <Company> <33.44>
    <cOmpany> <34.44>
         <coMpany> <35.44>
         <comPany> <36.44>


输出:

total lines: 4
Company: 33.440000
cOmpany: 34.440000
coMpany: 35.440000
comPany: 36.440000

关于c - C-逐行读取文件,忽略以某种格式分配值的前导和尾随空格,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36684067/

10-11 23:21
查看更多