Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 如何打印文件中的数据_C_File_Eof - Fatal编程技术网

C 如何打印文件中的数据

C 如何打印文件中的数据,c,file,eof,C,File,Eof,我很快就要参加c语言考试了,我需要一些文件方面的帮助。所以 任务是:用户将数据从控制台输入到文件(“prod.txt”),然后我需要将数据从文件打印到显示器上。我使用=EOF来打印它,但它不起作用。我试着使用==5(变量的数量),但它也没有发出呜呜声。我的代码 #include <stdlib.h> #include <stdio.h> #include <conio.h> #include <string.h> #include <loca

我很快就要参加c语言考试了,我需要一些文件方面的帮助。所以 任务是:用户将数据从控制台输入到文件(“prod.txt”),然后我需要将数据从文件打印到显示器上。我使用
=EOF
来打印它,但它不起作用。我试着使用==5(变量的数量),但它也没有发出呜呜声。我的代码

#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <locale.h>
#include <Windows.h>

struct icx //структурный файл для данных входного файла
{
    char media[100]; float year1937; float year1940; float year1950; float year1958;
};

struct icx a; 
struct icx b;
struct icx c;
struct icx d;
struct icx e;


char ss1[110] = "________________________________________________________________________________________";
char ss2[110] = "________________________________________________________________________________________";

void print_menu()
{
    system("cls"); // очищаем экран
    printf("\nМеню\n");
    printf("\n1. Создание исходного файла.");
    printf("\n2. Вывод на экран содержимого исходного файла.");
    printf("\n3. Обработка исходного файла.");
    printf("\n4. Вывод на экран содержимого выходного файла.");
    printf("\n5. Конец работы.\n");
    printf("\n");
}

int get_variant(int count)
{
    int variant;

    // пока ввод некорректен, сообщаем об этом и просим повторить его
    while (scanf_s("%i", &variant) != 1 || variant < 1 || variant > count)
    {
        printf("Некорректный ввод. Попробуйте снова: "); // выводим сообщение об ошибке
        scanf_s("%i", &variant); // считываем строку повторно
    }
    printf("\n");
    return variant;
}

void shapka1() {
    printf("%s\n", ss1);
    printf("! Средства массовой информации ! 1937 ! 1940 ! 1950 ! 1958!\n");
    printf("%s\n", ss1);
}

void shapka2()
{
    printf("%s\n", ss2);
    printf("! Вид СМИ ! Доля в 1937 ! Доля в 1940 ! Доля в 1950 ! Доля в 1958 ! \n");
    printf("%s\n", ss2);
}

void read_print_icx(FILE *prod) {
    struct icx str;
    printf("Входной файл\n");
    shapka1();
    while (fscanf_s(prod, "%s%f%f%f%f", str.media, _countof(str.media), &str.year1937, &str.year1940, &str.year1950, &str.year1958) != EOF) {
        printf("\n! %-17s ! %5.1f ! %5.1f ! %5.1f ! %5.1f !", str.media, str.year1937, str.year1940, str.year1950, str.year1958);
        printf("\n");
        printf("%s\n", ss1);
    }
    
}

void read_for_job(FILE *prod) {

    fscanf_s(prod, "%s%f%f%f%f", a.media, _countof(a.media), &a.year1937, &a.year1940, &a.year1950, &a.year1958);
    fscanf_s(prod, "%s%f%f%f%f", b.media, _countof(b.media), &b.year1937, &b.year1940, &b.year1950, &b.year1958);
    fscanf_s(prod, "%s%f%f%f%f", c.media, _countof(c.media), &c.year1937, &c.year1940, &c.year1950, &c.year1958);
    fscanf_s(prod, "%s%f%f%f%f", d.media, _countof(d.media), &d.year1937, &d.year1940, &d.year1950, &d.year1958);
    fscanf_s(prod, "%s%f%f%f%f", e.media, _countof(e.media), &e.year1937, &e.year1940, &e.year1950, &e.year1958);
}

void write_prod(FILE *prod) { // п1 меню
    
    if (&prod == NULL) {
        perror("Failed: ");
        return 1;
    }
    printf("Ввод данных таблицы : \n");
    scanf_s("%s%f%f%f%f", a.media, (unsigned)_countof(a.media), &a.year1937, &a.year1940, &a.year1950, &a.year1958);
    scanf_s("%s%f%f%f%f", b.media, (unsigned)_countof(b.media), &b.year1937, &b.year1940, &b.year1950, &b.year1958);
    scanf_s("%s%f%f%f%f", c.media, (unsigned)_countof(c.media), &c.year1937, &c.year1940, &c.year1950, &c.year1958);
    scanf_s("%s%f%f%f%f", d.media, (unsigned)_countof(d.media), &d.year1937, &d.year1940, &d.year1950, &d.year1958);
    scanf_s("%s%f%f%f%f", e.media, (unsigned)_countof(e.media), &e.year1937, &e.year1940, &e.year1950, &e.year1958);
    fprintf(prod, "\n %-14s %5.2f %5.2f %5.2f %5.2f ", a.media, a.year1937, a.year1940, a.year1950, a.year1958);
    fprintf(prod, "\n %-14s %5.2f %5.2f %5.2f %5.2f ", b.media, b.year1937, b.year1940, b.year1950, b.year1958);
    fprintf(prod, "\n %-14s %5.2f %5.2f %5.2f %5.2f ", c.media, c.year1937, c.year1940, c.year1950, c.year1958);
    fprintf(prod, "\n %-14s %5.2f %5.2f %5.2f %5.2f ", d.media, d.year1937, d.year1940, d.year1950, d.year1958);
    fprintf(prod, "\n %-14s %5.2f %5.2f %5.2f %5.2f ", e.media, e.year1937, e.year1940, e.year1950, e.year1958);
    fclose(prod);
}

int main(){
    setlocale(LC_ALL, "ru_RU.UTF-8");
    SetConsoleCP(1251); // Ввод с консоли в кодировке 1251
    SetConsoleOutputCP(1251);
    FILE *prod;
    fopen_s(&prod, "prod.txt", "w");
    
    //int variant; //пункт меню
    float oldradio1937, oldradio1940, oldradio1950, oldradio1958; // процент распространения трансляционных приемников
    float radio1937, radio1940, radio1950, radio1958; // процент распространения радио
    
    //fopen_s(&prod, "prod.txt", "w");
    write_prod(prod);
    read_print_icx(prod);
    printf("Выполнение расчетов\n");
    oldradio1937 = b.year1937 / a.year1937;
    oldradio1940 = b.year1940 / a.year1940;
    oldradio1950 = b.year1950 / a.year1950;
    oldradio1958 = b.year1958 / a.year1958;

    radio1937 = d.year1937 / c.year1937;
    radio1940 = d.year1940 / c.year1940;
    radio1950 = d.year1950 / c.year1950;
    radio1958 = d.year1958 / c.year1958;

    printf("\n%f%f%f%f%f%f%f%f", oldradio1937, oldradio1940, oldradio1950, oldradio1958, radio1937, radio1940, radio1950, radio1958);
    _getch();
    return 0;
}
我不知道如何修复它,甚至尝试
get
put
。没有结果。
请帮助我。

您的写入功能将关闭文件。发生这种情况后,什么会打开它?不相关,但在
get\u variant
中,您在循环中请求输入两次,并忽略其中一个值。你可能不想在循环中使用scanf。斯科特·约翰逊,你的意思是,我需要先再次打开文件,然后打印数据吗?格哈德,谢谢你的建议。是的,你必须重新打开它。您正在
write\u prod(prod)中关闭文件功能,然后在
读取打印icx(prod)
中尝试读取
prod
,再次打开文件时,使用fopen_s(&prod,“prod.txt”,“r”);-cos在写入模式下再次打开,其内容将被擦除。
while (fscanf_s(prod, "%s%f%f%f%f", str.media, _countof(str.media), &str.year1937, &str.year1940, &str.year1950, &str.year1958) != EOF) {
    printf("\n! %-17s ! %5.1f ! %5.1f ! %5.1f ! %5.1f !", str.media, str.year1937, str.year1940, str.year1950, str.year1958);
    printf("\n");
    printf("%s\n", ss1);
}