【问题标题】:Printing tokenized data from file in C从C中的文件打印标记化数据
【发布时间】:2013-05-18 04:47:58
【问题描述】:

我一直在尝试通过首先对文件进行标记来读取文件中的数据。在这个例子中,我已经做到了,它要求您首先在自己中输入数据(我已经确保它有效),然后将其读入,但用空格标记。因此,如果我要输入“Hello World”,它应该返回:“Hello, World”。 这是我的代码。

    char fname[] = "myfile";
FILE *fp;
fp = fopen(fname, "w+");
char buffer[20];

sprintf(prompt, "Enter your string: ", MAX_TAN_INPUT);
getString(number, MAX_TAN_INPUT, prompt);
printf("\n");

if (fp == NULL)
{
    fprintf(stderr, "Unable to open file %s\n", fname);
}
else
{
    printf("YAYYY. It opened!\n");

    fprintf (fp, "%s\n", number);

    fseek(fp, SEEK_SET, 0);
    fread(buffer, strlen(fp)+1, 1, fp);
    printf("%s\n", buffer);
    {
        /* No more data read. */
    }
}

printf ("HERE\n");

fclose(fp);

任何帮助将不胜感激 :)

【问题讨论】:

  • 当 strtok 函数采用 char* 时,您似乎正在传递 FILE*...此外,文件已关闭...linux.die.net/man/3/strtok
  • @Homer6 - 你是对的。我修复了文件关闭部分。仍在查看 FILE*/char* 部分。
  • 您可能应该先使用 fread 将文件的内容读入字符串...manpagez.com/man/3/fread 看看您是否可以谷歌查找示例并尝试组合示例...还有,例如@JimBalter说,发布和谷歌搜索编译器错误有很大帮助
  • @Homer6 - 我需要做的实际事情是将其读入二维链表。我仍然是一个菜鸟,正在研究如何做到这一点。我想我会先学习并正确阅读数据部分。
  • @YaserSleiman 为此我推荐 c++:cplusplus.com/reference/list/list/push_back 另外,如果你有时间,这个讲座价值一百万美元(如果可以的话,请观看所有这些并购买文本)@ 987654324@

标签: c token file-processing


【解决方案1】:

下面是c版本。但是,我必须说我更喜欢 c++ 版本。 :-) https://stackoverflow.com/a/3910610/278976

ma​​in.c

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

#define BUFFER_SIZE 1024


int main( int argc, char** argv ){

    const char *delimiter_characters = " ";
    const char *filename = "file.txt";
    FILE *input_file = fopen( filename, "r" );
    char buffer[ BUFFER_SIZE ];
    char *last_token;

    if( input_file == NULL ){

        fprintf( stderr, "Unable to open file %s\n", filename );

    }else{

        // Read each line into the buffer
        while( fgets(buffer, BUFFER_SIZE, input_file) != NULL ){

            // Write the line to stdout
            //fputs( buffer, stdout );

            // Gets each token as a string and prints it
            last_token = strtok( buffer, delimiter_characters );
            while( last_token != NULL ){
                printf( "%s\n", last_token );
                last_token = strtok( NULL, delimiter_characters );
            }

        }

        if( ferror(input_file) ){
            perror( "The following error occurred" );
        }

        fclose( input_file );

    }

    return 0;

}

文件.txt

Hello there, world!
How you doing?
I'm doing just fine, thanks!

Linux 外壳

root@ubuntu:/home/user# gcc main.c -o example
root@ubuntu:/home/user# ./example
Hello
there,
world!

How
you
doing?

I'm
doing
just
fine,
thanks!

【讨论】:

  • 哇哦!有多大帮助?!非常感谢@Homer6。目前正在研究您的代码。
  • 我明白你做了什么。您已经做到了,令牌之前的每一行都作为字符串输入然后打印。但我仍然不明白 ferror 函数会出现什么错误。我的意思是可能会出现错误,但它们都可能不同。因此,如果我要使用 ferror 作为向用户反馈的一种方式,我需要一个新的 ferror 函数来处理每个错误。是对的吗?还是 ferror 捕获所有错误?感谢您对荷马的所有帮助。我非常感激。 :)
  • ferror 函数用于“文件错误”。它旨在捕获 fgets 函数中可能出现的任何错误。我的理解是它会触发所有错误,并且您不需要使用 perror 打印错误消息,您只需检测错误并给出通用错误消息即可。要记住的主要事情是,在 c 中,您需要处理每个函数调用的错误。
  • 嗯。我懂了。但是在 C++ 和 Java 中不也是这样吗?我的意思是我记得学习异常以捕获 Java 和 C++ 中的所有内容,我从未学过也没有接近它。感谢荷马,你一直是很棒的帮助。另外,你发给我的那个链接:哇。我不敢相信我以前没有见过,而且还有很多课程还在继续。我可能只需要坐下来看着他们。
  • C 中没有例外。有例外的是 C++ 和 Java。我很高兴你喜欢这个讲座。恕我直言,Jerry Cain 是最好的计算机科学教授之一(这可能就是他在斯坦福的原因)。这是该课程的教科书:amazon.com/Computer-Systems-Programmers-Perspective-2nd/dp/…
【解决方案2】:
//  fread(buffer, strlen(number)+1, 1, fp);
    fscanf(fp, "%s", buffer);//read "hello"
    printf("%s, ", buffer);
    fscanf(fp, "%s", buffer);//read "world"
    printf("%s\n", buffer);

【讨论】:

  • 虽然 BLUEPIXY,但有些值不止一个字。这就是为什么我需要标记它。 :(
  • @YaserSleiman 另一种方法我需要更多或使用 strtok 如果切出的单词不仅是空格,而且没有显示。
  • 我没看懂你之前的评论 Blue,介意再说一遍吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多