【问题标题】:Read a file until a character in C读取文件直到 C 中的一个字符
【发布时间】:2011-02-08 03:00:23
【问题描述】:

假设我有一个格式如下的文件:

key1/value1
key2/value2
key3/value3
....

假设我有一个数组来保存这些值:

char *data[10][10]

如何读取此文件并将 key1、key2 和 key3 放入 data[0][0]、data[1][0] 和 data[2][0]。然后将 value1、value2 和 value3 放入 data[0][1]、data[2][1] 和 data[3][1]。所以实际上我想单独获取key1-key3的字符串,然后测试'/'字符然后获取value1-3的字符串。顺便说一句,当我将这些输入到文件中时,我包含了 '\n' 字符,因此您可以对其进行测试以测试换行符。

【问题讨论】:

    标签: c file-io file-read


    【解决方案1】:

    最好的方法是将每行的数据读入缓冲区,然后解析缓冲区。这可以扩展到读取大块数据。

    使用fgets 将数据读入缓冲区。

    使用strchr 查找分隔符。

    示例:

    #include <stdio.h>
    #include <stdlib.h>
    
    #define MAX_TEXT_LINE_LENGTH 128
    
    
    int main(void)
    {
        FILE *  my_file("data.txt", "r");
        char    text_read[MAX_TEXT_LINE_LENGTH];
        char    key_text[64];
        char    value_text[64];
    
        if (!my_file)
        {
            fprintf(stderr, "Error opening data file:  data.txt");
            return EXIT_FAILURE;
        }
        while (fgets(text_read, MAX_TEXT_LINE_LENGTH, my_file))
        {
            char * p;
            //----------------------------------------------
            //  Find the separator.
            //----------------------------------------------
            p = strchr('/');
    
            key_text[0] = '\0';
            value_text[0] = '\0';
    
            if (p != 0)
            {
                size_t  key_length = 0;
                key_length = p - text_read;
    
                //  Skip over the separator
                ++p;
                strcpy(value_text, p);
    
                strncpy(key_text, text_read, key_length);
                key_text[key_length] = '\0';
    
                fprintf(stdout,
                        "Found, key: \"%s\", value: \"%s\"\n",
                        key_text,
                        value_text);
            }
            else
            {
                fprintf(stdout,
                        "Invalid formatted text: \"%s\"\n",
                        text_read);
            }
        } // End:  while fgets
        fclose(my_file);
    
        return EXIT_SUCCESS;
    }
    

    注意:以上代码未经编译和测试,仅供说明之用。

    【讨论】:

      猜你喜欢
      • 2023-03-10
      • 2015-03-08
      • 2020-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多