w +在尝试读取文件内容时不起作用

时间:2018-07-10 05:18:11

标签: c fgets fputs

代码:

#include <stdio.h>

void main() {
    FILE *ptr;
    char buff[255];
    ptr = fopen("Test.txt", "w+");

    if (ptr != NULL) {
        printf("Success\n");
    }

    fputs("Hello", ptr);

    fgets(buff, 255, (FILE *)ptr);
    printf("%s", buff);
    fclose(ptr);
}

打开文件“ Text.txt”时,其内容为“ Hello”,但是我无法使用fgets将其打印出来。我在这里做错了什么?

3 个答案:

答案 0 :(得分:4)

读取前您没有倒带文件。 @extends('layouts.app') @section('title','Product List') @section('content') <div class="container"> <form method="POST" action="{{url('product/'.$product['id'])}}" class="form-horizontal"> <div class="form-group"> <label for="exampleInputEmail1">Name</label> {{csrf_field()}} {{ method_field('PUT')}} <!-- <input name="_method" type="hidden" value="PUT"> --> <input type="text" name="name" class="form-control" id="exampleInputEmail1" value="{{$product['name']}}" aria-describedby="emailHelp" placeholder=""> </div> <div class="form-group"> <label for="exampleInputEmail1">category</label> <input type="text" value="{{$product['category']}}" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" name="category" placeholder=""> </div> <div class="form-group"> <label for="exampleInputEmail1">weight</label> <input type="text" value="{{$product['weight']}}" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" name="weight" placeholder=""> </div> <div class="form-group"> <label for="exampleInputEmail1">price</label> <input type="text" value="{{$product['price']}}" class="form-control" id="exampleInputEmail1" aria-describedby="emailHelp" name="price" placeholder=""> </div> <button type="submit" class="btn btn-primary">Save</button> </form> </div> @endsection fseek(ptr, 0, SEEK_SET);

答案 1 :(得分:4)

阅读,例如https://en.cppreference.com/w/c/io/fopen

被我大胆

  

在更新模式('+')中,可以同时执行输入和输出,但是在没有强加于fflush,fseek,fsetpos或rewind的中间调用的情况下,输入之后不能输入,并且输入不能后面跟随输出,而不会介入调用fseek,fsetpos或rewind,除非输入操作遇到文件末尾。在更新模式下,即使指定了文本模式,也允许实现使用二进制模式。

答案 2 :(得分:3)

您的代码中存在多个问题:

  • 您必须发出对fseek()fsetpos()rewind()的调用,才能在写入和读取流之间进行切换,反之亦然。

  • main(不含参数)的原型为int main(void)

  • 无需在ptr中强制转换fgets(buff, 255, (FILE *)ptr);。无用的强制转换会隐藏类型不匹配和其他类似的错误。

  • 在将fgets()传递到buff之前,请勿测试printf()的返回值。如果fgets()失败,则行为不确定。

  • 您确实测试了fopen()的返回值,但仍然将可能为null的ptr传递给其他流函数,从而导致未定义的行为。

这是更正的版本:

#include <stdio.h>

int main(void) {
    FILE *ptr;
    char buff[255];

    ptr = fopen("Test.txt", "w+");
    if (ptr == NULL) {
        printf("Cannot open Test.txt\n");
        return 1;
    }
    printf("Success\n");

    fputs("Hello", ptr);
    rewind(ptr);
    if (fgets(buff, sizeof buff, ptr)) {
        printf("%s", buff);
    } else {
        printf("Cannot read from stream\n");
    }
    fclose(ptr);
    return 0;
}