代码:
#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
将其打印出来。我在这里做错了什么?
答案 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;
}