Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/56.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从文件读取并存储在C中_C_Scanf_Gets - Fatal编程技术网

从文件读取并存储在C中

从文件读取并存储在C中,c,scanf,gets,C,Scanf,Gets,我试图读入一个字符串后跟数字的文本文件,然后存储它的内容。到目前为止,如果格式正确,我只能让它只打印字符串(或者只打印int,或者两者都打印)。如何跳过空白行或格式错误的行(当前与前一行重复)并存储结果 #include <stdio.h> #include <stdlib.h> #include <string.h> #include "list.h" #define MAX_LINE_LENGTH 400 int main () { char

我试图读入一个字符串后跟数字的文本文件,然后存储它的内容。到目前为止,如果格式正确,我只能让它只打印字符串(或者只打印int,或者两者都打印)。如何跳过空白行或格式错误的行(当前与前一行重复)并存储结果

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "list.h"

#define MAX_LINE_LENGTH 400

int main ()
{
    char input[MAX_LINE_LENGTH];
    char name[MAX_LINE_LENGTH];
    int number;

    FILE *fr;
    fr = fopen ("updates.txt", "r");
    if (!fr)
    return 1;  
    while (fgets(input,MAX_LINE_LENGTH, fr)!=NULL)
    {
        /* get a line, up to 200 chars from fr.  done if NULL */
        sscanf (input, "%s", name);
        /* convert the string to just a string */
        printf ("%s\n", name);
    }
    fclose(fr);
    return 0;
}
#包括
#包括
#包括
#包括“list.h”
#定义最大直线长度400
int main()
{
字符输入[最大行长度];
字符名称[最大行长度];
整数;
文件*fr;
fr=fopen(“updates.txt”、“r”);
如果(!fr)
返回1;
while(fgets(输入,最大线长度,fr)!=NULL)
{
/*从fr获取一行,最多200个字符。如果为空,则完成*/
sscanf(输入,“%s”,名称);
/*将字符串转换为一个字符串*/
printf(“%s\n”,名称);
}
fclose(fr);
返回0;
}
示例文本文件

Cold 5 10 Flames Doggy 4 Flames 11 Cold 6 冷5 10火焰 小狗4 火焰11 冷6
您的问题可能的解决方案在下面的代码中

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "list.h"

#define MAX_LINE_LENGTH 400

int main ()
{
    char input[MAX_LINE_LENGTH];
    char name[MAX_LINE_LENGTH];
    char namet[MAX_LINE_LENGTH];
    int number;

    FILE *fr;
    fr = fopen ("updates.txt", "r");
    if (!fr)
    return 1;
    while (fgets(input,MAX_LINE_LENGTH, fr)!=NULL)
    {
        memset(name, 0, MAX_LINE_LENGTH);
        memset(namet, 0, MAX_LINE_LENGTH);
        /* get a line, up to 200 chars from fr.  done if NULL */
        //sscanf (input, "%s %d", name, &number);
        sscanf (input, "%s %s", name, namet);

        // TODO: compare here for name shall only contain letters A-Z/a-z
        // TODO: compare here for namet shall only contain digits

        // If both above condition true then go ahead
        number = atoi(namet);

        if(name[0] != '\0')
        {
                /* convert the string to just a string */
                printf ("%s %d\n", name, number);
                //printf ("%s %s\n", name, namet);
        }
    }
    fclose(fr);
    return 0;
}
#包括
#包括
#包括
#包括“list.h”
#定义最大直线长度400
int main()
{
字符输入[最大行长度];
字符名称[最大行长度];
字符名称[最大行长度];
整数;
文件*fr;
fr=fopen(“updates.txt”、“r”);
如果(!fr)
返回1;
while(fgets(输入,最大线长度,fr)!=NULL)
{
memset(名称,0,最大行长);
memset(名称,0,最大行长);
/*从fr获取一行,最多200个字符。如果为空,则完成*/
//sscanf(输入,“%s%d”、名称和编号);
sscanf(输入,“%s%s”,名称);
//TODO:此处比较名称,名称应仅包含字母A-Z/A-Z
//TODO:此处比较名称,名称应仅包含数字
//如果上述两个条件均为真,则继续
编号=atoi(名称);
如果(名称[0]!='\0')
{
/*将字符串转换为一个字符串*/
printf(“%s%d\n”,名称,编号);
//printf(“%s%s\n”,名称,名称);
}
}
fclose(fr);
返回0;
}

您可以使用fscanf功能。格式字符串中的空格可以忽略任何空格、制表符或换行符。

而不是

while (fgets(input,MAX_LINE_LENGTH, fr)!=NULL)
{
  /* get a line, up to 200 chars from fr.  done if NULL */
  sscanf (input, "%s", name);
  /* convert the string to just a string */
  printf ("%s\n", name);
}
执行此操作(它将删除所有空格和\n并仅取出令牌)


非常感谢。以下是读取和打印行的解决方案:将while循环替换为while(fscanf(fr,“%s%d”、name和number)==2),并注释掉sscanf。谢谢有人能告诉我如何做一个while循环直到文件结束吗?
while (fgets(input,MAX_LINE_LENGTH, fr)!=NULL)
{
  char* token = strtok(input, " \n");
  while ( token != NULL )
  {
    printf( "%s", token );
    token = strtok(NULL, " \n");
  }
}