C编程:fscanf到fgets代码

时间:2014-01-23 10:48:08

标签: c

我有一个文本文件,其中包含一些我想要输出到屏幕上的句子。

The time to come.
Normal, common, or expected.
A special set of clothes worn by all the members of a particular group or organization
Already made use of, as in a used car.
Bing
A circle of light shown around or above the head of a holy person.
The god of thunder.
An act that is against the law.
Long dress worn by women.
Odd behaviour.

这是我用来为这些定义生成单词输出的代码,但是Scanf不喜欢空格,所以有人可以编辑这段代码来输出上面的定义,谢谢。

应该说这个预告片但输出应该是一次1个句子。

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

FILE *fp;
int main(void)
{

struct store
{
char id[128];
}stock[10];

int printnum;
int allrec=0;
int startrec=0;

fp=fopen("Test 24 Definitions.txt","r");
printf("i");
fscanf(fp,"%s",&stock[startrec].id);

while(!feof(fp))
{
printf("%s", stock[startrec].id);
printf(" \n");
getch();
startrec=startrec+1;
allrec=startrec;
fscanf(fp,"%s",&stock[startrec].id);
}

fclose(fp); 

printf("\n\n\n\n");
int i;
for (i=0; i<allrec; i++)
{
printf("%s\n",stock[i].id);
getch();
}
}

带有fgets的示例代码将不胜感激

4 个答案:

答案 0 :(得分:0)

这可能有助于您理解

#include <stdio.h>
#include <stdlib.h>
FILE *fp;
int main(void)
{

struct store
{
char id[128];
}stock[10];

int printnum;
int allrec=0;
int startrec=0;

fp=fopen("Test 24 Definitions.txt","r");

while(!feof(fp))
{
    fscanf(fp,"%[^\t]s",stock[startrec].id);
    printf("%s", stock[startrec].id); 
}

fclose(fp);
return 0;
}

答案 1 :(得分:0)

使用ftell获取文件的大小。然后使用fgets读取文件内容。不要使用feof来查找文件的末尾。 “while( !feof( file ) )” is always wrong

试试这段代码。

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

#define MAX_LINE_LENGH 255

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

    fseek(fp, 0, SEEK_END); 
    size = ftell(fp); 
    fseek(fp, 0, SEEK_SET); 

    while(size>0)
    {
        fgets(id, MAX_LINE_LENGH, fp);
        printf("%s", id);
        /* copy this id to any char array if you want */
        size = size-strlen(id);
    }   
    fclose(fp); 
    printf("\n");
}

答案 2 :(得分:0)

代码前的一些评论:

  • 我删除了conio - 未使用或不需要
  • 我删除了allrec,因为你可以使用我重命名为rec
  • 的startrec
  • 没有必要使用getc()(不是getch(),来自libcurses),fgets读取到换行符,包括那个
  • 我检查文件是否实际打开,否则您将冒险从NULL读取,导致段错误
  • 在打印for循环中,我使用getchar()而不是getch()
#include <stdio.h>
#include <stdlib.h>
FILE *fp;
int main(void)
{

    struct store
    {
        char id[128];
    } stock[10];

    int allrec=0;
    int rec=0;
    int res;
    fp = fopen("text.txt","r");
    if(!fp) printf("failed to open file\n");

    while(!feof(fp))
    {
        res = fgets(&stock[rec].id, 128, fp);
        if(!res) {
            break;
        }
        printf("%s", stock[rec].id);
        rec++;
    }
    fclose(fp);

    printf("\n\n\n\n");
    int i;
    fflush(stdin);
    for (i=0; i<rec; i++)
    {
        printf("%s",stock[i].id);
        getchar();
    }
}

答案 3 :(得分:0)

要使用fscanf()而不是单词阅读一行文字,请在2个地方使用以下代码:

fscanf(fp,"%127[^\n]%*c", stock[startrec].id);

"%127[^\n]"如果不跳过前导空格,请最多阅读127 char。除了不在'\n'中阅读。存储结果,并附加'\0'stock[startrec].id

"%*c"如果不跳过前导空格,请阅读任意1 char。这是阻止前一个的'\n'或我们现在处于EOF状态的'*'fgets()表示不保存结果。

或者更好......

使用\n,根据需要修剪典型的尾随fgets(stock[startrec].id, sizeof stock[startrec].id, fp);

fscanf()

建议检查fgets()feof()的结果并删除printf("i"); if (fp != NULL) { int cnt; while((cnt = fscanf(fp, "%s", stock[startrec].id)) != EOF) { if (cnt < 1) Handle_NothingWasRead(); printf("%s", stock[startrec].id); printf(" \n"); getch(); startrec = startrec + 1; allrec = startrec; } }

{{1}}