逐个字符地读取文件,在C中逐行读取

时间:2016-05-07 18:04:29

标签: c file io

我有一个包含多行的文件。每行有两个由空格分隔的数字。 我需要使用此代码,打印第一行,打印整个文件,但逐行

do
{
   fscanf(fp,"%c", &c);
   if(c == ' ')
     break;
   printf("%c", c);
}
while (c != ' ');

do
{
   fscanf(fp, "%c", &c);
   printf("%c", c);
}
while( c != '\n');

我尝试使用fgets但进入了一个无限循环。

while(fgets(buf, sizeof buf, fp) != NULL) // assuming buf can handle the line lenght
{
   //code above
}

为什么我不能使用这样的fgets来逐行打印?

样品

输入:

10 5003 20 320 4003 200

输出

10 5003
20 320
4003 200

2 个答案:

答案 0 :(得分:2)

显然我无法使用你的确切代码,或者你不会问这个问题,但这是一个类似的想法,做得有点不同,而且还使用导致你麻烦的$(document).on('click', 'input', function (e) { doSomething(); }); 。它的工作原理是搜索每一行的数字和非数字。请注意,我$(document).on('click', 'input', function (e) { var inputForm = e.target; modal.modal({show:true}); modal.find(".btn-success").click(function () { var choice = $("modal").find('input[type=radio]:checked').val(); if (choice) { modal.modal('hide'); inputForm.value = choice; } }); }); 要慷慨,因为在上一个问题中,您说每个数字可以有500个数字,因此该行可能至少为1000个字符。

fgets

编辑你可以让它更简洁,用循环读取每组数字:

#define MAXLEN 2000

程序输出(来自您的输入):

#include <stdio.h>
#include <ctype.h>

#define MAXLEN  2000

int main(void)
{
    FILE *fp;
    char line[MAXLEN];
    char *ptr;
    if((fp = fopen("test.txt", "rt")) == NULL)
        return 0;                               // or other action

    while(fgets(line, MAXLEN, fp) != NULL) {
        ptr = line;
        // first number
        while(*ptr && !isdigit(*ptr)) {        // skip non-digits
            ptr++;
        }
        while(*ptr && isdigit(*ptr)) {
            printf("%c", *ptr++);              // print digits
        }
        printf(" ");

        // second number
        while(*ptr && !isdigit(*ptr)) {        // skip non-digits
            ptr++;
        }
        while(*ptr && isdigit(*ptr)) {
            printf("%c", *ptr++);              // print digits
        }
        printf("\n");

    }
    fclose(fp);
    return 0;
}

答案 1 :(得分:1)

如果我们用printf替换printf(fp,&#34;%c&#34;,c)(&#34;%c&#34;,c)(因为我们不在文件中打印,对吧?) ,以下示例应该完成这项工作(它创建了十行的测试文件)。

Timer t = new Timer();
        t.schedule(
                new TimerTask() {

        @Override public void run(){
              Firebase ref = new Firebase("https://fsn1xtvlo0z.firebaseio-demo.com/Move/connection");
              ref.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot snapshot) {
                        String connected = String.valueOf(snapshot.getValue());
                        /*if (connected.equals("a"))
                            label8.setText("Connected to Phone");*/
                        if (connected.equals("c"))
                            label8.setText("Phone is not connected");
                    }
                    @Override
                    public void onCancelled(FirebaseError firebaseError) {
                        label8.setText("No Connection");
                    }
                });
              ref.setValue("c");              
          }
        }, 0, 5000);