从文本文件中的字符串中的两个单词

时间:2018-02-28 12:22:04

标签: c

我正在尝试在字符串中输入两个单词而我不知道如何才能这样做。我试过但是如果在文本文件中我有'名字Penny Marie'它给了我:名字Penny。我怎样才能在s1中获得Penny Marie?谢谢

#include <stdio.h>
#include <stdlib.h>

int main()
{
    printf("Hello world!\n");
    char s[50];
    char s1[20];

    FILE* fp = fopen("file.txt", "rt");
    if (fp == NULL)
        return 0;

    fscanf(fp,"%s %s",s,s1);
    {
        printf("%s\n",s);
        printf("%s",s1);
    }
    fclose(fp);
    return 0;
}

5 个答案:

答案 0 :(得分:3)

更改fscanf格式,告诉它​​在新行之前不要停止阅读:

fscanf(fp,"%s %[^\n]s",s,s1);

答案 1 :(得分:1)

您应使用fgets

您可以尝试这样做:

fscanf(fp,"%s %s %s", s0, s, s1);
{
    printf("%s\n",s);
    printf("%s",s1);
}

并将s0声明为void *

答案 2 :(得分:1)

其他答案解决了针对您所述需求的fscanf来电的调整问题。 (虽然fscanf()通常不是您提出要求的最佳方式。)您的问题是关于获得2个单词的问题,Penny&amp; Marie,来自包含name Penny Marie的文件中的一行。如评论中所述,如果文件包含多于一行需要解析,或者名称字符串包含可变数量的名称,该怎么办?通常,以下函数和技术更合适,更常用于从文件中读取内容并将其内容解析为字符串:

fopen() and its arguments.
fgets()
strtok() (或strtok_r()
How to determine count of lines in a file (用于创建字符串数组)
How to read lines of file into array of strings 的。

可以通过多种方式调整部署这些技术和功能,以解析文件中的内容。为了说明,下面实现了一个使用这些技术的小例子,它将处理您所述的需求,包括每个文件多行和每行中可变数量的名称。

在本地目录中给出文件:names.txt

name Penny Marie
name Jerry Smith
name Anthony James
name William Begoin
name Billy Jay Smith
name Jill Garner
name Cyndi Elm
name Bill Jones
name Ella Fitz Bella Jay
name Jerry

以下读取文件以根据行数表征其内容,并且最长行创建一个字符串数组,然后使用文件中的名称填充数组中的每个字符串,而不管名称的部分数量。

int main(void)
{
    // get count of lines in file:
    int longest=0, i;
    int count = count_of_lines(".\\names.txt", &longest);

    // create array of strings with information from above
    char names[count][longest+2]; // +2 - newline and NULL
    char temp[longest+2];
    char *tok;

    FILE *fp = fopen(".\\names.txt", "r");
    if(fp)
    {
        for(i=0;i<count;i++)
        {
            if(fgets(temp, longest+2, fp))// read next line
            {
                tok = strtok(temp, " \n"); // throw away "name" and space 
                if(tok)
                {
                    tok = strtok(NULL, " \n");//capture first name of line.
                    if(tok)
                    {
                        strcpy(names[i], tok); // write first name element to string.
                        tok = strtok(NULL, " \n");
                        while(tok) // continue until all name elements in line are read
                        {   //concatenate remaining name elements
                            strcat(names[i], " ");// add space between name elements
                            strcat(names[i], tok);// next name element
                            tok = strtok(NULL, " \n");
                        }
                    }
                }
            }

        }
    }
    return 0;
}


// returns count, and passes back longest
int count_of_lines(char *filename, int *longest)
{
    int count = 0;
    int len=0, lenKeep=0;
    int c;
    FILE *fp = fopen(filename, "r");
    if(fp)
    {
        c = getc(fp);
        while(c != EOF)
        {
            if(c != '\n') 
            {
                len++;  
            }
            else
            {
                lenKeep = (len < lenKeep) ? lenKeep : len;
                len = 0;
                count++;
            }
            c = getc(fp);
        }
        fclose(fp);
        *longest = lenKeep;
    }
    return count;       
}

答案 3 :(得分:0)

console.log()行更改为fscanf

然后您可以fscanf(fp, "%s %s %s", s, s1, s2)printfs1变量设为“Penny”和“Marie”。

答案 4 :(得分:0)

尝试功能fgets

   fp = fopen("file.txt" , "r");
   if(fp == NULL) {
      perror("Error opening file");
      return(-1);
   }
   if( fgets (str, 60, fp)!=NULL ) {
      /* writing content to stdout */
      puts(str);
   }
   fclose(fp);

在上面的代码中,它会写出最多60个字符的内容。如果我没有弄错的话,您可以使用str(len)使该部分动态化。